FieldGrantLogic.php 37KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681
  1. <?php
  2. /**
  3. * 字段授权逻辑类
  4. *
  5. * @author qifan
  6. * @date 2020-12-01
  7. */
  8. namespace app\admin\logic;
  9. use think\Db;
  10. class FieldGrantLogic
  11. {
  12. private $except = [
  13. 'leads' => [
  14. 'name', 'email', 'source', 'mobile', 'telephone', 'detail_address', 'industry', 'level', 'next_time',
  15. 'remark', 'owner_user_id', 'last_record', 'create_user_id', 'create_time', 'update_time', 'last_time'
  16. ],
  17. 'customer' => [
  18. 'name', 'source', 'mobile', 'telephone', 'website', 'industry', 'level', 'next_time', 'remark', 'email',
  19. 'owner_user_id', 'last_record', 'create_user_id', 'create_time', 'update_time', 'last_time', 'obtain_time',
  20. 'deal_status', 'is_lock', 'pool_day'
  21. ],
  22. 'contacts' => [
  23. 'name', 'customer_id', 'mobile', 'telephone', 'email', 'post', 'decision', 'detail_address', 'next_time',
  24. 'remark', 'sex', 'owner_user_id', 'create_user_id', 'create_time', 'update_time', 'last_time', 'last_record'
  25. ],
  26. 'business' => [
  27. 'name', 'customer_id', 'money', 'deal_date', 'remark', 'status_id', 'type_id', 'owner_user_id',
  28. 'create_user_id', 'create_time', 'update_time', 'last_time', 'last_record'
  29. ],
  30. 'contract' => [
  31. 'name', 'num', 'customer_id', 'business_id', 'money', 'order_date', 'start_time', 'end_time', 'contacts_id',
  32. 'order_user_id', 'remark', 'owner_user_id', 'create_user_id', 'create_time', 'update_time', 'last_time',
  33. 'last_record', 'done_money', 'un_money', 'check_status'
  34. ],
  35. 'receivables' => [
  36. 'number', 'customer_id', 'contract_id', 'plan_id', 'return_time', 'money', 'return_type', 'remark',
  37. 'owner_user_id', 'create_user_id', 'create_time', 'update_time', 'check_status'
  38. ],
  39. 'product' => [
  40. 'name', 'category_id', 'unit', 'num', 'price', 'description', 'status', 'owner_user_id', 'create_user_id',
  41. 'create_time', 'update_time'
  42. ],
  43. 'visit' => [
  44. 'number', 'visit_time', 'owner_user_id', 'shape', 'customer_id', 'contacts_id', 'contract_id', 'satisfaction',
  45. 'feedback', 'create_user_id', 'create_time', 'update_time'
  46. ]
  47. ];
  48. /**
  49. * 字段授权列表
  50. *
  51. * @param $param
  52. * @return array|bool|\PDOStatement|string|\think\Model|null
  53. * @throws \think\db\exception\DataNotFoundException
  54. * @throws \think\db\exception\ModelNotFoundException
  55. * @throws \think\exception\DbException
  56. */
  57. public function index($param)
  58. {
  59. $where = function ($query) use ($param) {
  60. $query->where('module', $param['module']);
  61. $query->where('column', $param['column']);
  62. $query->where('role_id', $param['role_id']);
  63. };
  64. $count = Db::name('admin_field_grant')->where($where)->count();
  65. # 如果该角色下没有字段授权数据则自动添加
  66. if ($count == 0 && Db::name('admin_group')->where('id', $param['role_id'])->find()) {
  67. $this->createCrmFieldGrant($param['role_id']);
  68. }
  69. $data = Db::name('admin_field_grant')->field(['grant_id', 'content'])->where($where)->find();
  70. if (!empty($data['content'])) $data['content'] = unserialize($data['content']);
  71. return !empty($data) ? $data : [];
  72. }
  73. /**
  74. * 添加字段授权信息
  75. *
  76. * @param $roleId
  77. * @throws \think\db\exception\DataNotFoundException
  78. * @throws \think\db\exception\ModelNotFoundException
  79. * @throws \think\exception\DbException
  80. */
  81. public function createCrmFieldGrant($roleId)
  82. {
  83. # 添加线索字段授权数据
  84. $this->createLeadsFieldGrant($roleId);
  85. # 添加客户字段授权数据
  86. $this->createCustomerFieldGrant($roleId);
  87. # 添加联系人字段授权数据
  88. $this->createContactsFieldGrant($roleId);
  89. # 添加商机字段授权数据
  90. $this->createBusinessFieldGrant($roleId);
  91. # 添加合同字段授权数据
  92. $this->createContractFieldGrant($roleId);
  93. # 添加回款字段授权数据
  94. $this->createReceivablesFieldGrant($roleId);
  95. # 添加产品字段授权信息
  96. $this->createProductFieldGrant($roleId);
  97. # 添加回访字段授权信息
  98. $this->createVisitFieldGrant($roleId);
  99. }
  100. /**
  101. * 更新授权字段
  102. *
  103. * @param $grantId
  104. * @param $content
  105. * @return int|string
  106. * @throws \think\Exception
  107. * @throws \think\exception\PDOException
  108. */
  109. public function update($grantId, $content)
  110. {
  111. return Db::name('admin_field_grant')->where('grant_id', $grantId)->update(['content' => serialize(array_values($content))]);
  112. }
  113. /**
  114. * 删除授权字段数据
  115. *
  116. * @param $roleId
  117. * @param string $module
  118. * @throws \think\Exception
  119. * @throws \think\exception\PDOException
  120. */
  121. public function deleteCrmFieldGrant($roleId)
  122. {
  123. Db::name('admin_field_grant')->where('module', 'crm')->where('role_id', $roleId)->delete();
  124. }
  125. /**
  126. * 拷贝字段授权数据
  127. *
  128. * @param $copyId
  129. * @param $roleId
  130. * @throws \think\db\exception\DataNotFoundException
  131. * @throws \think\db\exception\ModelNotFoundException
  132. * @throws \think\exception\DbException
  133. */
  134. public function copyCrmFieldGrant($copyId, $roleId)
  135. {
  136. $data = [];
  137. $list = Db::name('admin_field_grant')->where('module', 'crm')->where('role_id', $copyId)->select();
  138. foreach ($list AS $key => $value) {
  139. $data[] = [
  140. 'role_id' => $roleId,
  141. 'module' => $value['module'],
  142. 'column' => $value['column'],
  143. 'content' => $value['content'],
  144. 'create_time' => time(),
  145. 'update_time' => time()
  146. ];
  147. }
  148. if (!empty($data)) Db::name('admin_field_grant')->insertAll($data);
  149. }
  150. /**
  151. * 同步更新自定义字段的授权信息
  152. *
  153. * @param $types
  154. * @return bool
  155. * @throws \think\Exception
  156. * @throws \think\db\exception\DataNotFoundException
  157. * @throws \think\db\exception\ModelNotFoundException
  158. * @throws \think\exception\DbException
  159. * @throws \think\exception\PDOException
  160. */
  161. public function fieldGrantDiyHandle($types)
  162. {
  163. $typesArray = explode('_', $types);
  164. # 只处理客户管理角色下的字段授权
  165. if ($typesArray[0] != 'crm') return false;
  166. # 查询自定义字段表
  167. $fieldBaseData = [];
  168. $fieldList = Db::name('admin_field')->field(['name', 'field'])->where('types', $types)->select();
  169. foreach ($fieldList AS $key => $value) {
  170. # 排除掉固定字段
  171. if (in_array($value['field'], $this->except[$typesArray[1]])) continue;
  172. $fieldBaseData[$value['field']] = $value;
  173. }
  174. # 查询字段授权表
  175. $grantList = Db::name('admin_field_grant')->field(['grant_id', 'content'])->where('column', $typesArray[1])->select();
  176. # 处理授权字段的数据更新
  177. foreach ($grantList AS $key => $value) {
  178. $content = unserialize($value['content']);
  179. $fieldData = $fieldBaseData;
  180. foreach ($content AS $k => $v) {
  181. # 只处理自定义字段
  182. if ($v['is_diy'] == 0) continue;
  183. if (empty($fieldData[$v['field']])) {
  184. # 【处理删除:】没有在$fieldData找到,说明自定义字段被删除,则进行同步删除。
  185. unset($content[(int)$k]);
  186. } else {
  187. # 【处理更新:】如果在$fieldData找到,则进行同步更新。
  188. $content[$k]['name'] = $fieldData[$v['field']]['name'];
  189. $content[$k]['field'] = $fieldData[$v['field']]['field'];
  190. # 删除$fieldData的数据,方便统计新增的自定义字段。
  191. unset($fieldData[(string)$v['field']]);
  192. }
  193. }
  194. # 【处理新增】如果$fieldData还有数据,说明是新增的,则进行同步新增。
  195. if (!empty($fieldData)) {
  196. foreach ($fieldData AS $k => $v) {
  197. $content[] = [
  198. 'name' => $v['name'],
  199. 'field' => $v['field'],
  200. 'read' => 1,
  201. 'read_operation' => 1,
  202. 'write' => 1,
  203. 'write_operation' => 1,
  204. 'is_diy' => 1
  205. ];
  206. }
  207. }
  208. Db::name('admin_field_grant')->where('grant_id', $value['grant_id'])->update(['content' => serialize(array_values($content))]);
  209. }
  210. return true;
  211. }
  212. /**
  213. * 处理线索字段授权数据
  214. *
  215. * @param int $roleId 角色ID
  216. * @author fanqi
  217. * @date 2021-03-22
  218. */
  219. private function createLeadsFieldGrant($roleId)
  220. {
  221. # 固定字段
  222. $content = [
  223. ['field' => 'name', 'read' => 1, 'read_operation' => 0, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '线索名称'],
  224. ['field' => 'email', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '邮箱'],
  225. ['field' => 'source', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '线索来源'],
  226. ['field' => 'mobile', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '手机'],
  227. ['field' => 'telephone', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '电话'],
  228. ['field' => 'detail_address', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '地址'],
  229. ['field' => 'industry', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '客户行业'],
  230. ['field' => 'level', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '客户级别'],
  231. ['field' => 'next_time', 'read' => 1, 'read_operation' => 0, 'write' => 1, 'write_operation' => 0, 'is_diy' => 0, 'name' => '下次联系时间'],
  232. ['field' => 'remark', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '备注'],
  233. ['field' => 'owner_user_id', 'read' => 1, 'read_operation' => 0, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '负责人'],
  234. ['field' => 'last_record', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '最后跟进记录'],
  235. ['field' => 'create_user_id', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '创建人'],
  236. ['field' => 'create_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '创建时间'],
  237. ['field' => 'update_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '更新时间'],
  238. ['field' => 'last_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '最后跟进时间'],
  239. ];
  240. $leadsList = Db::name('admin_field')->field(['name', 'field'])->where('types', 'crm_leads')->select();
  241. # 自定义字段
  242. foreach ($leadsList AS $key => $value) {
  243. if (in_array($value['field'], $this->except['leads'])) continue;
  244. $content[] = [
  245. 'name' => $value['name'],
  246. 'field' => $value['field'],
  247. 'read' => 1,
  248. 'read_operation' => 1,
  249. 'write' => 1,
  250. 'write_operation' => 1,
  251. 'is_diy' => 1
  252. ];
  253. }
  254. Db::name('admin_field_grant')->insert([
  255. 'role_id' => $roleId,
  256. 'module' => 'crm',
  257. 'column' => 'leads',
  258. 'content' => serialize($content),
  259. 'create_time' => time(),
  260. 'update_time' => time()
  261. ]);
  262. }
  263. /**
  264. * 处理客户字段授权数据
  265. *
  266. * @param int $roleId 角色ID
  267. * @author fanqi
  268. * @date 2021-03-22
  269. */
  270. private function createCustomerFieldGrant($roleId)
  271. {
  272. # 固定字段
  273. $content = [
  274. ['field' => 'name', 'read' => 1, 'read_operation' => 0, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '客户名称'],
  275. ['field' => 'source', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '客户来源'],
  276. ['field' => 'mobile', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '手机'],
  277. ['field' => 'telephone', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '电话'],
  278. ['field' => 'website', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '网址'],
  279. ['field' => 'industry', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '客户行业'],
  280. ['field' => 'level', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '客户级别'],
  281. ['field' => 'next_time', 'read' => 1, 'read_operation' => 0, 'write' => 1, 'write_operation' => 0, 'is_diy' => 0, 'name' => '下次联系时间'],
  282. ['field' => 'remark', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '备注'],
  283. ['field' => 'email', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '邮箱'],
  284. ['field' => 'owner_user_id', 'read' => 1, 'read_operation' => 0, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '负责人'],
  285. ['field' => 'last_record', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '最后跟进记录'],
  286. ['field' => 'create_user_id', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '创建人'],
  287. ['field' => 'create_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '创建时间'],
  288. ['field' => 'update_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '更新时间'],
  289. ['field' => 'last_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '最后跟进时间'],
  290. ['field' => 'obtain_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '负责人获取客户时间'],
  291. ['field' => 'deal_status', 'read' => 1, 'read_operation' => 0, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '成交状态'],
  292. ['field' => 'is_lock', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '锁定状态'],
  293. ['field' => 'pool_day', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '距进入公海天数'],
  294. ];
  295. $customerList = Db::name('admin_field')->field(['name', 'field'])->where('types', 'crm_customer')->select();
  296. # 自定义字段
  297. foreach ($customerList AS $key => $value) {
  298. if (in_array($value['field'], $this->except['customer'])) continue;
  299. $content[] = [
  300. 'name' => $value['name'],
  301. 'field' => $value['field'],
  302. 'read' => 1,
  303. 'read_operation' => 1,
  304. 'write' => 1,
  305. 'write_operation' => 1,
  306. 'is_diy' => 1
  307. ];
  308. }
  309. Db::name('admin_field_grant')->insert([
  310. 'role_id' => $roleId,
  311. 'module' => 'crm',
  312. 'column' => 'customer',
  313. 'content' => serialize($content),
  314. 'create_time' => time(),
  315. 'update_time' => time()
  316. ]);
  317. }
  318. /**
  319. * 处理联系人字段授权数据
  320. *
  321. * @param int $roleId 角色ID
  322. * @author fanqi
  323. * @date 2021-03-22
  324. */
  325. private function createContactsFieldGrant($roleId)
  326. {
  327. # 固定字段
  328. $content = [
  329. ['field' => 'name', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '姓名'],
  330. ['field' => 'customer_id', 'read' => 1, 'read_operation' => 0, 'write' => 1, 'write_operation' => 0, 'is_diy' => 0, 'name' => '客户名称'],
  331. ['field' => 'mobile', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '手机'],
  332. ['field' => 'telephone', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '电话'],
  333. ['field' => 'email', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '邮箱'],
  334. ['field' => 'post', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '职务'],
  335. ['field' => 'decision', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '是否关键决策人'],
  336. ['field' => 'detail_address', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '地址'],
  337. ['field' => 'next_time', 'read' => 1, 'read_operation' => 0, 'write' => 1, 'write_operation' => 0, 'is_diy' => 0, 'name' => '下次联系时间'],
  338. ['field' => 'remark', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '备注'],
  339. ['field' => 'sex', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '性别'],
  340. ['field' => 'owner_user_id', 'read' => 1, 'read_operation' => 0, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '负责人'],
  341. ['field' => 'create_user_id', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '创建人'],
  342. ['field' => 'create_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '创建时间'],
  343. ['field' => 'update_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '更新时间'],
  344. ['field' => 'last_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '最后跟进时间'],
  345. ];
  346. $contactsList = Db::name('admin_field')->field(['name', 'field'])->where('types', 'crm_contacts')->select();
  347. # 自定义字段
  348. foreach ($contactsList AS $key => $value) {
  349. if (in_array($value['field'], $this->except['contacts'])) continue;
  350. $content[] = [
  351. 'name' => $value['name'],
  352. 'field' => $value['field'],
  353. 'read' => 1,
  354. 'read_operation' => 1,
  355. 'write' => 1,
  356. 'write_operation' => 1,
  357. 'is_diy' => 1
  358. ];
  359. }
  360. Db::name('admin_field_grant')->insert([
  361. 'role_id' => $roleId,
  362. 'module' => 'crm',
  363. 'column' => 'contacts',
  364. 'content' => serialize($content),
  365. 'create_time' => time(),
  366. 'update_time' => time()
  367. ]);
  368. }
  369. /**
  370. * 处理商机字段授权数据
  371. *
  372. * @param int $roleId 角色ID
  373. * @author fanqi
  374. * @date 2021-03-22
  375. */
  376. private function createBusinessFieldGrant($roleId)
  377. {
  378. # 固定字段
  379. $content = [
  380. ['field' => 'name', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '商机名称'],
  381. ['field' => 'customer_id', 'read' => 1, 'read_operation' => 0, 'write' => 1, 'write_operation' => 0, 'is_diy' => 0, 'name' => '客户名称'],
  382. ['field' => 'money', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '商机金额'],
  383. ['field' => 'deal_date', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '预计成交日期'],
  384. ['field' => 'remark', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '备注'],
  385. ['field' => 'status_id', 'read' => 1, 'read_operation' => 0, 'write' => 1, 'write_operation' => 0, 'is_diy' => 0, 'name' => '商机阶段'],
  386. ['field' => 'type_id', 'read' => 1, 'read_operation' => 0, 'write' => 1, 'write_operation' => 0, 'is_diy' => 0, 'name' => '商机状态组'],
  387. ['field' => 'owner_user_id', 'read' => 1, 'read_operation' => 0, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '负责人'],
  388. ['field' => 'create_user_id', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '创建人'],
  389. ['field' => 'create_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '创建时间'],
  390. ['field' => 'update_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '更新时间'],
  391. ['field' => 'last_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '最后跟进时间'],
  392. ];
  393. $BusinessList = Db::name('admin_field')->field(['name', 'field'])->where('types', 'crm_business')->select();
  394. # 自定义字段
  395. foreach ($BusinessList AS $key => $value) {
  396. if (in_array($value['field'], $this->except['business'])) continue;
  397. $content[] = [
  398. 'name' => $value['name'],
  399. 'field' => $value['field'],
  400. 'read' => 1,
  401. 'read_operation' => 1,
  402. 'write' => 1,
  403. 'write_operation' => 1,
  404. 'is_diy' => 1
  405. ];
  406. }
  407. Db::name('admin_field_grant')->insert([
  408. 'role_id' => $roleId,
  409. 'module' => 'crm',
  410. 'column' => 'business',
  411. 'content' => serialize($content),
  412. 'create_time' => time(),
  413. 'update_time' => time()
  414. ]);
  415. }
  416. /**
  417. * 处理合同字段授权数据
  418. *
  419. * @param int $roleId 角色ID
  420. * @author fanqi
  421. * @date 2021-03-22
  422. */
  423. private function createContractFieldGrant($roleId)
  424. {
  425. # 固定字段
  426. $content = [
  427. ['field' => 'name', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '合同名称'],
  428. ['field' => 'num', 'read' => 1, 'read_operation' => 0, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '合同编号'],
  429. ['field' => 'customer_id', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '客户名称'],
  430. ['field' => 'business_id', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '商机名称'],
  431. ['field' => 'money', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '合同金额'],
  432. ['field' => 'order_date', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '下单时间'],
  433. ['field' => 'start_time', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '合同开始时间'],
  434. ['field' => 'end_time', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '合同结束时间'],
  435. ['field' => 'contacts_id', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '客户签约人'],
  436. ['field' => 'order_user_id', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '公司签约人'],
  437. ['field' => 'remark', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '备注'],
  438. ['field' => 'owner_user_id', 'read' => 1, 'read_operation' => 0, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '负责人'],
  439. ['field' => 'create_user_id', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '创建人'],
  440. ['field' => 'create_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '创建时间'],
  441. ['field' => 'update_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '更新时间'],
  442. ['field' => 'last_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '最后跟进时间'],
  443. ['field' => 'last_record', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '最后跟进记录'],
  444. ['field' => 'done_money', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '已收款金额'],
  445. ['field' => 'un_money', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '未收款金额'],
  446. ['field' => 'check_status', 'read' => 1, 'read_operation' => 0, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '审核状态'],
  447. ];
  448. $contractList = Db::name('admin_field')->field(['name', 'field'])->where('types', 'crm_contract')->select();
  449. # 自定义字段
  450. foreach ($contractList AS $key => $value) {
  451. if (in_array($value['field'], $this->except['contract'])) continue;
  452. $content[] = [
  453. 'name' => $value['name'],
  454. 'field' => $value['field'],
  455. 'read' => 1,
  456. 'read_operation' => 1,
  457. 'write' => 1,
  458. 'write_operation' => 1,
  459. 'is_diy' => 1
  460. ];
  461. }
  462. Db::name('admin_field_grant')->insert([
  463. 'role_id' => $roleId,
  464. 'module' => 'crm',
  465. 'column' => 'contract',
  466. 'content' => serialize($content),
  467. 'create_time' => time(),
  468. 'update_time' => time()
  469. ]);
  470. }
  471. /**
  472. * 处理回款字段授权数据
  473. *
  474. * @param int $roleId 角色ID
  475. * @author fanqi
  476. * @date 2021-03-22
  477. */
  478. private function createReceivablesFieldGrant($roleId)
  479. {
  480. # 固定字段
  481. $content = [
  482. ['field' => 'number', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '回款编号'],
  483. ['field' => 'customer_id', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '客户名称'],
  484. ['field' => 'contract_id', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '合同编号'],
  485. ['field' => 'plan_id', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '期数'],
  486. ['field' => 'return_time', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '回款日期'],
  487. ['field' => 'money', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '回款金额'],
  488. ['field' => 'return_type', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '回款方式'],
  489. ['field' => 'remark', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '备注'],
  490. ['field' => 'contract_money', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '合同金额'],
  491. ['field' => 'owner_user_id', 'read' => 1, 'read_operation' => 0, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '负责人'],
  492. ['field' => 'create_user_id', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '创建人'],
  493. ['field' => 'create_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '创建时间'],
  494. ['field' => 'update_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '更新时间'],
  495. ['field' => 'check_status', 'read' => 1, 'read_operation' => 0, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '审核状态'],
  496. ];
  497. $receivablesList = Db::name('admin_field')->field(['name', 'field'])->where('types', 'crm_receivables')->select();
  498. # 自定义字段
  499. foreach ($receivablesList AS $key => $value) {
  500. if (in_array($value['field'], $this->except['receivables'])) continue;
  501. $content[] = [
  502. 'name' => $value['name'],
  503. 'field' => $value['field'],
  504. 'read' => 1,
  505. 'read_operation' => 1,
  506. 'write' => 1,
  507. 'write_operation' => 1,
  508. 'is_diy' => 1
  509. ];
  510. }
  511. Db::name('admin_field_grant')->insert([
  512. 'role_id' => $roleId,
  513. 'module' => 'crm',
  514. 'column' => 'receivables',
  515. 'content' => serialize($content),
  516. 'create_time' => time(),
  517. 'update_time' => time()
  518. ]);
  519. }
  520. /**
  521. * 处理产品字段授权信息
  522. *
  523. * @param int $roleId 角色ID
  524. * @author fanqi
  525. * @date 2021-03-22
  526. */
  527. private function createProductFieldGrant($roleId)
  528. {
  529. # 固定字段
  530. $content = [
  531. ['field' => 'name', 'read' => 1, 'read_operation' => 0, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '产品名称'],
  532. ['field' => 'category_id', 'read' => 1, 'read_operation' => 0, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '产品类型'],
  533. ['field' => 'unit', 'read' => 1, 'read_operation' => 0, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '产品单位'],
  534. ['field' => 'num', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '产品编码'],
  535. ['field' => 'price', 'read' => 1, 'read_operation' => 0, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '价格'],
  536. ['field' => 'description', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '产品描述'],
  537. ['field' => 'status', 'read' => 1, 'read_operation' => 0, 'write' => 1, 'write_operation' => 0, 'is_diy' => 0, 'name' => '是否上下架'],
  538. ['field' => 'owner_user_id', 'read' => 1, 'read_operation' => 0, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '负责人'],
  539. ['field' => 'create_user_id', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '创建人'],
  540. ['field' => 'create_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '创建时间'],
  541. ['field' => 'update_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '更新时间'],
  542. ];
  543. $productList = Db::name('admin_field')->field(['name', 'field'])->where('types', 'crm_product')->select();
  544. # 自定义字段
  545. foreach ($productList AS $key => $value) {
  546. if (in_array($value['field'], $this->except['product'])) continue;
  547. $content[] = [
  548. 'name' => $value['name'],
  549. 'field' => $value['field'],
  550. 'read' => 1,
  551. 'read_operation' => 1,
  552. 'write' => 1,
  553. 'write_operation' => 1,
  554. 'is_diy' => 1
  555. ];
  556. }
  557. Db::name('admin_field_grant')->insert([
  558. 'role_id' => $roleId,
  559. 'module' => 'crm',
  560. 'column' => 'product',
  561. 'content' => serialize($content),
  562. 'create_time' => time(),
  563. 'update_time' => time()
  564. ]);
  565. }
  566. /**
  567. * 处理回访字段授权信息
  568. *
  569. * @param int $roleId
  570. * @author fanqi
  571. * @date 2021-03-22
  572. */
  573. private function createVisitFieldGrant($roleId)
  574. {
  575. $content = [
  576. ['field' => 'number', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '回访编号'],
  577. ['field' => 'visit_time', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '回访时间'],
  578. ['field' => 'owner_user_id', 'read' => 1, 'read_operation' => 0, 'write' => 1, 'write_operation' => 0, 'is_diy' => 0, 'name' => '回访人'],
  579. ['field' => 'shape', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '回访形式'],
  580. ['field' => 'customer_id', 'read' => 1, 'read_operation' => 0, 'write' => 1, 'write_operation' => 0, 'is_diy' => 0, 'name' => '客户名称'],
  581. ['field' => 'contacts_id', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '联系人'],
  582. ['field' => 'contract_id', 'read' => 1, 'read_operation' => 0, 'write' => 1, 'write_operation' => 0, 'is_diy' => 0, 'name' => '合同编号'],
  583. ['field' => 'satisfaction', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '客户满意度'],
  584. ['field' => 'feedback', 'read' => 1, 'read_operation' => 1, 'write' => 1, 'write_operation' => 1, 'is_diy' => 0, 'name' => '客户反馈'],
  585. ['field' => 'create_user_id', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '创建人'],
  586. ['field' => 'create_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '创建时间'],
  587. ['field' => 'update_time', 'read' => 1, 'read_operation' => 1, 'write' => 0, 'write_operation' => 0, 'is_diy' => 0, 'name' => '更新时间'],
  588. ];
  589. $visitList = Db::name('admin_field')->field(['name', 'field'])->where('types', 'crm_visit')->select();
  590. # 处理自定义字段
  591. foreach ($visitList AS $key => $value) {
  592. if (in_array($value['field'], $this->except['visit'])) continue;
  593. $content[] = [
  594. 'name' => $value['name'],
  595. 'field' => $value['field'],
  596. 'read' => 1,
  597. 'read_operation' => 1,
  598. 'write' => 1,
  599. 'write_operation' => 1,
  600. 'is_diy' => 1
  601. ];
  602. }
  603. Db::name('admin_field_grant')->insert([
  604. 'role_id' => $roleId,
  605. 'module' => 'crm',
  606. 'column' => 'visit',
  607. 'content' => serialize($content),
  608. 'create_time' => time(),
  609. 'update_time' => time()
  610. ]);
  611. }
  612. }