CustomerLogic.php 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778
  1. <?php
  2. declare(strict_types=1);
  3. namespace app\logics;
  4. use app\model\Customer as Model;
  5. use app\model\CustomerPortraitField;
  6. use app\model\CustomerVisitLog;
  7. use app\model\Org;
  8. use app\model\Pool;
  9. use app\model\Setting;
  10. use app\model\Employee;
  11. use app\model\Company;
  12. use app\model\CustomerSource;
  13. use app\model\Decostyle;
  14. class CustomerLogic
  15. {
  16. public static function list($condition = [], $page, $limit, $order)
  17. {
  18. $page = intval($page);
  19. $limit = intval($limit);
  20. $data = Model::with(['employee', 'org', 'designer','source'])->withCount(['visitLog' => function ($query) {
  21. $query->where(function($query){
  22. $query->whereOr([[CustomerVisitLog::changeState(['state', '=', '预约量房'])], [CustomerVisitLog::changeState(['state', '=', '预约到店'])], [CustomerVisitLog::changeState(['state', '=', '预约活动'])]]);
  23. });
  24. }])->withCount(['activityFrequency' => function ($query) {
  25. $query->where([CustomerVisitLog::changeState(['state', '=', '确认到场'])]);
  26. }])
  27. ->where($condition)
  28. ->page($page, $limit)->order($order)->select();
  29. $data = $data->visible(['id', 'employee_id', 'name', 'community_name', 'phone', 'level', 'state', 'square', 'revisit_time', 'addtime', 'last_contact_date', 'org_id', 'protected_to', 'is_resource', 'employee.name', 'org_name', 'designer.name', 'visit_log_count', 'activity_frequency_count','source_id','source.source', 'phone1', 'phone2','remark','crm_res_id','agents_id'])->toArray();
  30. foreach ($data as &$item) {
  31. $item['protected'] = false;
  32. if (isset($item['protected_to']) && time() < strtotime($item['protected_to'])) {
  33. $item['protected'] = true;
  34. }
  35. $item['square'] = floatval($item['square']);
  36. $item['phone'] = substr_replace($item['phone'], '******', 3, 6);
  37. $item['phone1'] = $item['phone1'] ? substr_replace($item['phone1'], '******', 3, 6) : '';
  38. $item['phone2'] = $item['phone2'] ? substr_replace($item['phone2'], '******', 3, 6) : '';
  39. //增加跟进次数
  40. $item['lognum'] = CustomerVisitLog::with('employee')->where('customer_id','=',$item['id'])->count();
  41. }
  42. return $data;
  43. }
  44. public static function poollist($condition = [], $page, $limit, $order)
  45. {
  46. $page = intval($page);
  47. $limit = intval($limit);
  48. $data = Model::field('id, name, community_name, phone, phone1, phone2, level, state, square, addtime, org_id, employee_id, is_resource, before_pool')
  49. ->where($condition)
  50. ->page($page, $limit)->order($order)->select()->toArray();
  51. foreach ($data as &$item) {
  52. $item['pool_name'] = Org::where('id', $item['org_id'])->column('name');
  53. if (!$item['employee_id']) {
  54. $item['phone'] = substr_replace($item['phone'], '******', 3, 6);
  55. $item['phone1'] = !empty($item['phone1'])?substr_replace($item['phone1'], '******', 3, 6):'';
  56. $item['phone2'] = !empty($item['phone2'])?substr_replace($item['phone2'], '******', 3, 6):'';
  57. }
  58. }
  59. return $data;
  60. }
  61. public static function resourcelist($condition = [], $page, $limit, $order)
  62. {
  63. $page = intval($page);
  64. $limit = intval($limit);
  65. $data = Model::field('id, name, community_name, phone, level, state, square, addtime,org_id,crm_res_id, employee_id, is_resource')
  66. ->where($condition)
  67. ->page($page, $limit)->order($order)->select()->toArray();
  68. foreach ($data as &$item) {
  69. $item['pool_name'] = Org::where('id', $item['org_id'])->column('name');
  70. if (!$item['employee_id'] && $item['is_resource'] == 1) {
  71. $item['phone'] = substr_replace($item['phone'], '******', 3, 6);
  72. }
  73. }
  74. return $data;
  75. }
  76. public static function count($condition = [])
  77. {
  78. return Model::where($condition)->count();
  79. }
  80. public static function info($id)
  81. {
  82. return Model::where('id', $id)->find();
  83. }
  84. //新数据处理
  85. public function new_data_save($cusdata, $extdata, $list)
  86. {
  87. foreach ($list as $key => $val) {
  88. foreach ($val['child'] as $k => $v) {
  89. $selid = '';
  90. $selname = '';
  91. $save1 = ['name', 'phone', 'phone1','phone2','community_name', 'house_delivery_time', 'plan_deco_time', 'square', 'budget'];
  92. $save2 = ['level', 'house_type', 'deco_style', 'source_id'];
  93. if (in_array($v['keyname'], $save1)) {
  94. $list[$key]['child'][$k]['value'] = !empty($cusdata[$v['keyname']]) ? $cusdata[$v['keyname']] : '';
  95. }
  96. if (in_array($v['keyname'], $save2)) {
  97. foreach ($v['select'] as $r => $e) {
  98. if ($e['name'] == $cusdata[$v['keyname']] || $e['id'] == $cusdata[$v['keyname']]) {
  99. $selid = $e['id'];
  100. $selname = $e['name'];
  101. $list[$key]['child'][$k]['select'][$r]['check'] = in_array($v['type'], [3,4]) ? 'true' : 'false'; //是否选中值,客服pc端报备渲染使用
  102. }
  103. }
  104. $list[$key]['child'][$k]['value'] = $selid;
  105. $list[$key]['child'][$k]['valname'] = $selname;
  106. }
  107. // 上面已经赋值的固定字段,下方扩展字段可能存值但是可能是旧值,所以得排除 save1,save2 的合集 排除来源
  108. $saved_field = ['name', 'phone', 'phone1','phone2','community_name', 'house_delivery_time', 'plan_deco_time', 'budget', 'level', 'house_type', 'deco_style'];
  109. $selname1 = '';
  110. foreach ($extdata as $p => $m) {
  111. if ($m['id'] == $v['id'] && !in_array($v['keyname'], $saved_field)) {
  112. if(!empty($v['keyname']) && $v['keyname'] == 'sign_time' && !empty($m['value'])) $m['value'] = date("Y/m/d H:i",strtotime($m['value']));
  113. $list[$key]['child'][$k]['value'] = $m['value'];
  114. if (in_array($v['type'], [3, 4]) && !empty($m['value'])) {
  115. $sp = explode(',', (string)$m['value']);
  116. foreach ($v['select'] as $w => $q) {
  117. if (in_array($q['id'], $sp)) {
  118. $selname1 .= $q['name'] . ',';
  119. $list[$key]['child'][$k]['select'][$w]['check'] = 'true'; //是否选中值,客服pc端报备渲染使用
  120. }
  121. }
  122. $list[$key]['child'][$k]['valname'] = trim($selname1, ',');
  123. }
  124. //图片类型
  125. if (in_array($v['type'], [6]) && !empty($m['value'])) {
  126. $img = explode(',', $m['value']);
  127. $img_arr = [];
  128. foreach ($img as $url) {
  129. $img_arr[] = [
  130. 'url' => $url,
  131. 'oss_url' => 'https://'.config('app.ali_oss_bindurl').'/'.$url
  132. ];
  133. }
  134. $list[$key]['child'][$k]['value'] = $img_arr;
  135. }
  136. }
  137. }
  138. if(!empty($v['keyname']) && $v['keyname'] == 'sign_time' && empty($list[$key]['child'][$k]['value'])) $list[$key]['child'][$k]['value'] = date('Y/m/d H:i',strtotime($cusdata['sign_time']));
  139. }
  140. }
  141. return $list;
  142. }
  143. public function get_old_ext(){
  144. $extAttr = [
  145. 'ext1' => '年龄',
  146. 'ext2' => '是否首次装修',
  147. 'ext3' => '消费水平',
  148. 'ext4' => '预计装修时间',
  149. 'ext5' => '客户爱好',
  150. 'ext6' => '是否添加微信',
  151. 'ext7' => '客户空闲时间段',
  152. 'ext8' => '家庭结构',
  153. 'ext9' => '家庭成员意见',
  154. 'ext10' => '请选择房屋户型',
  155. 'ext11' => '决策人',
  156. 'ext12' => '客户喜欢的色调',
  157. 'ext13' => '房屋结构',
  158. 'ext14' => '装修方式',
  159. 'ext15' => '客户其它需求',
  160. 'ext16' => '客户痛点',
  161. 'ext17' => '重视环保',
  162. 'ext18' => '重视设计',
  163. 'ext19' => '关注的工艺',
  164. 'ext20' => '关注房屋的空间',
  165. 'ext21' => '汽车价格',
  166. 'ext22' => '房屋价格',
  167. 'ext23' => '买小区的原因',
  168. 'ext24' => '周边配置',
  169. 'ext25' => '设计师服务',
  170. 'ext26' => '方案满意度',
  171. 'ext27' => '报价满意度',
  172. 'ext28' => '装修意向',
  173. 'ext29' => '是否到店',
  174. 'ext30' => '预计到店时间',
  175. 'ext31' => '是否交定',
  176. 'ext32' => '客户其他需求',
  177. 'ext33' => '当前所在区域',
  178. 'ext34' => '加微类型',
  179. 'ext35' => '建群情况',
  180. 'ext36' => '直播情况',
  181. 'ext37' => '直播人员',
  182. 'ext38' => '房屋用途',
  183. 'ext39' => '房屋位置',
  184. 'ext40' => '其他房屋信息',
  185. 'ext41' => '谈单时长',
  186. 'ext42' => '门牌单元号',
  187. 'ext43' => '业务直播人员',
  188. 'ext44' => '设计直播人员'
  189. ];
  190. return $extAttr;
  191. }
  192. //老数据转换
  193. public function old_data_save($cusdata, $list)
  194. {
  195. $extAttr = $this->get_old_ext();
  196. //$ext='{"ext1": "20-30岁", "ext2": "是", "ext3": "低", "ext4": ", "ext5": "", "ext6": "是", "ext7": "", "ext8": "三口之家", "ext9": "满意", "ext10": "3居室", "ext11": "父亲", "ext12": "红色调", "ext13": "商品房", "ext14": "套餐", "ext15": "", "ext16": "环保", "ext17": "", "ext18": "", "ext19": "", "ext20": "", "ext21": "", "ext22": "", "ext23": "", "ext24": "", "ext25": "", "ext26": "", "ext27": "", "ext28": "非常强烈", "ext29": "", "ext30": "", "ext31": "", "ext32": "", "ext33": "", "ext34": "", "ext35": "", "ext36": "", "ext37": "", "ext38": "", "ext39": "", "ext40": ""}';
  197. //$ext = get_object_vars($cusdata['ext']);
  198. $ext = json_decode($cusdata['ext'],true);
  199. $xin = [];
  200. foreach ($ext as $key => $val) {
  201. foreach ($extAttr as $k => $v) {
  202. if ($k == $key) {
  203. $a['name'] = $v;
  204. $a['value'] = $val;
  205. }
  206. }
  207. $xin[] = $a;
  208. }
  209. foreach ($list as $key => $val) {
  210. foreach ($val['child'] as $k => $v) {
  211. $selid = '';
  212. $selname = '';
  213. $save1 = ['name', 'phone', 'community_name', 'house_delivery_time', 'plan_deco_time', 'square', 'budget'];
  214. $save2 = ['age_range', 'level', 'house_type', 'deco_style', 'source_id'];
  215. if (in_array($v['keyname'], $save1)) {
  216. $list[$key]['child'][$k]['value'] = !empty($cusdata[$v['keyname']]) ? $cusdata[$v['keyname']] : '';
  217. }
  218. if (in_array($v['keyname'], $save2)) {
  219. foreach ($v['select'] as $r => $e) {
  220. if ($e['name'] == $cusdata[$v['keyname']]) {
  221. $selid = $e['id'];
  222. $selname = $e['name'];
  223. $list[$key]['child'][$k]['select'][$r]['check'] = in_array($v['type'], [3,4]) ? 'true' : 'false'; //是否选中值,客服pc端报备渲染使用
  224. }
  225. }
  226. $list[$key]['child'][$k]['value'] = $selid;
  227. $list[$key]['child'][$k]['valname'] = $selname;
  228. }
  229. foreach ($xin as $p => $m) {
  230. $selid = '';
  231. $selname = '';
  232. if ($m['name'] == $v['name']) {
  233. if (in_array($v['type'], [1, 2, 5])) {
  234. $list[$key]['child'][$k]['value'] = $m['value'];
  235. }
  236. if ($v['type'] == 3) {
  237. foreach ($v['select'] as $r => $e) {
  238. if ($e['name'] == $m['value']) {
  239. $selid = $e['id'];
  240. $selname = $e['name'];
  241. $list[$key]['child'][$k]['select'][$r]['check'] = 'true'; //是否选中值,客服pc端报备渲染使用
  242. }
  243. }
  244. $list[$key]['child'][$k]['value'] = $selid;
  245. $list[$key]['child'][$k]['valname'] = $selname;
  246. }
  247. if ($v['type'] == 4) {
  248. if (!empty($m['value'])) {
  249. $dv = explode(',', $m['value']);
  250. foreach ($v['select'] as $r => $e) {
  251. if (in_array($e['name'], $dv)) {
  252. $selid .= $e['id'] . ',';
  253. $selname .= $e['name'] . ',';
  254. $list[$key]['child'][$k]['select'][$r]['check'] = 'true'; //是否选中值,客服pc端报备渲染使用
  255. }
  256. }
  257. }
  258. $list[$key]['child'][$k]['value'] = trim($selid, ',');
  259. $list[$key]['child'][$k]['valname'] = $selname;
  260. }
  261. //图片类型
  262. if ($v['type'] == 6 && !empty($m['value'])) {
  263. $img = explode(',', $m['value']);
  264. $img_arr = [];
  265. foreach ($img as $url) {
  266. $img_arr[] = [
  267. 'url' => $url,
  268. 'oss_url' => 'https://'.config('app.ali_oss_bindurl').'/'.$url
  269. ];
  270. }
  271. $list[$key]['child'][$k]['value'] = $img_arr;
  272. }
  273. }
  274. }
  275. if(!empty($v['keyname']) && $v['keyname'] == 'sign_time' && empty($list[$key]['child'][$k]['value'])) $list[$key]['child'][$k]['value'] = date('Y/m/d H:i',strtotime($cusdata['sign_time']));
  276. }
  277. }
  278. return $list;
  279. }
  280. public function new_data_saves($cusdata, $extdata, $list)
  281. {
  282. foreach ($list as $key => $val) {
  283. $list[$key]['value'] = '';
  284. $list[$key]['valname'] = '';
  285. $selid = '';
  286. $selname = '';
  287. $save1 = ['name', 'phone', 'community_name', 'house_delivery_time', 'plan_deco_time', 'square', 'budget'];
  288. $save2 = ['level', 'house_type', 'deco_style', 'source_id'];
  289. if (in_array($val['keyname'], $save1)) {
  290. $list[$key]['value'] = !empty($cusdata[$val['keyname']]) ? $cusdata[$val['keyname']] : '';
  291. }
  292. if (in_array($val['keyname'], $save2)) {
  293. foreach ($val['select'] as $r => $e) {
  294. if ($e['name'] == $cusdata[$val['keyname']] || $e['id'] == $cusdata[$val['keyname']]) {
  295. $selid = $e['id'];
  296. $selname = $e['name'];
  297. }
  298. }
  299. $list[$key]['value'] = $selid;
  300. $list[$key]['valname'] = $selname;
  301. }
  302. // 上面已经赋值的固定字段,下方扩展字段可能存值但是可能是旧值,所以得排除 save1,save2 的合集 排除
  303. $saved_field = ['name', 'phone', 'phone1','phone2','community_name', 'house_delivery_time', 'plan_deco_time', 'square', 'budget', 'level', 'house_type', 'deco_style'];
  304. $selname1 = '';
  305. foreach ($extdata as $p => $m) {
  306. if (isset($m['value']) && isset($m['keyname']) && isset($m['id']) && $m['id'] == $val['id'] && !in_array($m['keyname'], $saved_field)) {
  307. $list[$key]['value'] = $m['value'];
  308. if (in_array($val['type'], [3, 4]) && !empty($m['value'])) {
  309. $sp = explode(',', (string)$m['value']);
  310. foreach ($val['select'] as $w => $q) {
  311. if (in_array($q['id'], $sp)) {
  312. $selname1 .= $q['name'] . ',';
  313. }
  314. }
  315. $list[$key]['valname'] = trim($selname1, ',');
  316. }else{
  317. $list[$key]['valname'] = $m['value'];
  318. }
  319. //图片类型
  320. if (in_array($val['type'], [6]) && !empty($m['value'])) {
  321. $img = explode(',', $m['value']);
  322. $img_arr = [];
  323. foreach ($img as $url) {
  324. $img_arr[] = [
  325. 'url' => $url,
  326. 'oss_url' => 'https://'.config('app.ali_oss_bindurl').'/'.$url
  327. ];
  328. }
  329. $list[$key]['value'] = $img_arr;
  330. }
  331. }
  332. }
  333. }
  334. return $list;
  335. }
  336. //老数据转换
  337. public function old_data_saves($cusdata, $list)
  338. {
  339. $extAttr = $this->get_old_ext();
  340. //$ext='{"ext1": "20-30岁", "ext2": "是", "ext3": "低", "ext4": ", "ext5": "", "ext6": "是", "ext7": "", "ext8": "三口之家", "ext9": "满意", "ext10": "3居室", "ext11": "父亲", "ext12": "红色调", "ext13": "商品房", "ext14": "套餐", "ext15": "", "ext16": "环保", "ext17": "", "ext18": "", "ext19": "", "ext20": "", "ext21": "", "ext22": "", "ext23": "", "ext24": "", "ext25": "", "ext26": "", "ext27": "", "ext28": "非常强烈", "ext29": "", "ext30": "", "ext31": "", "ext32": "", "ext33": "", "ext34": "", "ext35": "", "ext36": "", "ext37": "", "ext38": "", "ext39": "", "ext40": ""}';
  341. //$ext = get_object_vars($cusdata['ext']);
  342. $ext = json_decode($cusdata['ext'],true);
  343. $xin = [];
  344. foreach ($ext as $key => $val) {
  345. foreach ($extAttr as $k => $v) {
  346. if ($k == $key) {
  347. $a['name'] = $v;
  348. $a['value'] = $val;
  349. }
  350. }
  351. $xin[] = $a;
  352. }
  353. foreach ($list as $key => $val) {
  354. $list[$key]['value'] = '';
  355. $list[$key]['valname'] = '';
  356. $selid = '';
  357. $selname = '';
  358. $save1 = ['name', 'phone', 'community_name', 'house_delivery_time', 'plan_deco_time', 'square', 'budget'];
  359. $save2 = ['age_range', 'level', 'house_type', 'deco_style', 'source_id'];
  360. if (in_array($val['keyname'], $save1)) {
  361. $list[$key]['value'] = !empty($cusdata[$val['keyname']]) ? $cusdata[$val['keyname']] : '';
  362. }
  363. if (in_array($val['keyname'], $save2)) {
  364. foreach ($val['select'] as $r => $e) {
  365. if ($e['name'] == $cusdata[$val['keyname']]) {
  366. $selid = $e['id'];
  367. $selname = $e['name'];
  368. }
  369. }
  370. $list[$key]['value'] = $selid;
  371. $list[$key]['valname'] = $selname;
  372. }
  373. foreach ($xin as $p => $m) {
  374. $selid = '';
  375. $selname = '';
  376. if ($m['name'] == $val['name']) {
  377. if (in_array($val['type'], [1, 2, 5])) {
  378. $list[$key]['value'] = $m['value'];
  379. $list[$key]['valname'] = $m['value'];
  380. }
  381. if ($val['type'] == 3) {
  382. foreach ($val['select'] as $r => $e) {
  383. if ($e['name'] == $m['value']) {
  384. $selid = $e['id'];
  385. $selname = $e['name'];
  386. }
  387. }
  388. $list[$key]['value'] = $selid;
  389. $list[$key]['valname'] = $selname;
  390. }
  391. if ($val['type'] == 4) {
  392. if (!empty($m['value'])) {
  393. $dv = explode(',', $m['value']);
  394. foreach ($val['select'] as $r => $e) {
  395. if (in_array($e['name'], $dv)) {
  396. $selid .= $e['id'] . ',';
  397. $selname .= $e['name'] . ',';
  398. }
  399. }
  400. }
  401. $list[$key]['value'] = trim($selid, ',');
  402. $list[$key]['valname'] = trim($selname,',');
  403. }
  404. //图片类型
  405. if ($val['type'] == 6 && !empty($m['value'])) {
  406. $img = explode(',', $m['value']);
  407. $img_arr = [];
  408. foreach ($img as $url) {
  409. $img_arr[] = [
  410. 'url' => $url,
  411. 'oss_url' => 'https://'.config('app.ali_oss_bindurl').'/'.$url
  412. ];
  413. }
  414. $list[$key]['value'] = $img_arr;
  415. }
  416. }
  417. }
  418. }
  419. return $list;
  420. }
  421. /**
  422. * ext无数据时处理
  423. */
  424. public function no_ext_save($cusdata, $list)
  425. {
  426. foreach ($list as $key => $val) {
  427. foreach ($val['child'] as $k => $v) {
  428. $selid = '';
  429. $selname = '';
  430. $save1 = ['name', 'phone', 'community_name', 'house_delivery_time', 'plan_deco_time', 'square', 'budget'];
  431. $save2 = ['age_range', 'level', 'house_type', 'deco_style', 'source_id'];
  432. if (in_array($v['keyname'], $save1)) {
  433. //$list[$key]['child'][$k]['value'] = !empty($cusdata[$v['keyname']]) ? $cusdata[$v['keyname']] : '';
  434. $selid = !empty($cusdata[$v['keyname']]) ? $cusdata[$v['keyname']] : '';
  435. $selname = !empty($cusdata[$v['keyname']]) ? $cusdata[$v['keyname']] : '';
  436. }
  437. if (in_array($v['keyname'], $save2)) {
  438. foreach ($v['select'] as $r => $e) {
  439. if ($e['name'] == $cusdata[$v['keyname']]) {
  440. $selid = $e['id'];
  441. $selname = $e['name'];
  442. $list[$key]['child'][$k]['select'][$r]['check'] = in_array($v['type'], [3,4]) ? 'true' : 'false'; //是否选中值,客服pc端报备渲染使用
  443. }
  444. }
  445. }
  446. $list[$key]['child'][$k]['value'] = $selid;
  447. $list[$key]['child'][$k]['valname'] = $selname;
  448. if(!empty($v['keyname']) && $v['keyname'] == 'sign_time') $list[$key]['child'][$k]['value'] = date('Y/m/d H:i',strtotime($cusdata['sign_time']));
  449. }
  450. }
  451. return $list;
  452. }
  453. /**
  454. * ext无数据时处理
  455. */
  456. public function no_ext_saves($cusdata, $list)
  457. {
  458. foreach ($list as $k => $v) {
  459. $selid = '';
  460. $selname = '';
  461. $save1 = ['name', 'phone', 'community_name', 'house_delivery_time', 'plan_deco_time', 'square', 'budget'];
  462. $save2 = ['age_range', 'level', 'house_type', 'deco_style', 'source_id'];
  463. if (in_array($v['keyname'], $save1)) {
  464. $list[$k]['value'] = !empty($cusdata[$v['keyname']]) ? $cusdata[$v['keyname']] : '';
  465. }
  466. if (in_array($v['keyname'], $save2)) {
  467. foreach ($v['select'] as $r => $e) {
  468. if ($e['name'] == $cusdata[$v['keyname']]) {
  469. $selid = $e['id'];
  470. $selname = $e['name'];
  471. }
  472. }
  473. }
  474. $list[$k]['value'] = $selid;
  475. $list[$k]['valname'] = $selname;
  476. }
  477. return $list;
  478. }
  479. /**
  480. * 旧ext编辑保存
  481. */
  482. public function old_ext_edit($cusdata, $save_ext, $new_ext){
  483. $old_ext = $this->get_old_ext();
  484. $ext = json_decode($cusdata['ext'],true);
  485. // 数据的旧ext处理
  486. $xin = [];
  487. foreach ($ext as $key => $val) {
  488. foreach ($old_ext as $k => $v) {
  489. if ($k == $key) {
  490. $a['name'] = $v;
  491. $a['value'] = $val;
  492. }
  493. }
  494. $xin[] = $a;
  495. }
  496. //旧ext处理成新的ext结构
  497. $old_data = [];
  498. foreach ($xin as $k => $v){
  499. foreach ($new_ext as $kk => $vv){
  500. if ($v['name'] == $vv['name'] && !empty($v['value'])) {
  501. $old_data['id'] = $vv['id'];
  502. $old_data['keyname'] = $vv['keyname'];
  503. $old_data['value'] = $v['value'];
  504. }
  505. }
  506. }
  507. // 旧ext数据和新的保存数据合并。
  508. foreach ($old_data as $k => $v) {
  509. foreach ($save_ext as $kk => $vv){
  510. if ($v['id'] == $vv['id']){
  511. unset($save_ext[$kk]);
  512. $old_data[$k]['value'] = $vv['value'];
  513. isset($vv['type']) ? $old_data[$k]['type'] = $vv['type'] : ''; //当时图片类型时保留
  514. }
  515. }
  516. }
  517. $save_ext = array_values($save_ext);
  518. $return_data = [];
  519. if (!empty($save_ext) && !empty($old_data)){
  520. $return_data = array_merge($save_ext, $old_data);
  521. } elseif (!empty($old_data)){
  522. $return_data = $old_data;
  523. } elseif (!empty($save_ext)) {
  524. $return_data = $save_ext;
  525. }
  526. return $return_data;
  527. }
  528. /**
  529. * 新ext编辑保存
  530. */
  531. public function new_ext_edit($cusdata, $save_ext){
  532. $old_data = json_decode($cusdata['ext'],true);
  533. // 旧ext数据和新的保存数据合并。
  534. foreach ($old_data as $k => $v) {
  535. foreach ($save_ext as $kk => $vv){
  536. if ($v['id'] == $vv['id']){
  537. unset($save_ext[$kk]);
  538. $old_data[$k]['value'] = $vv['value'];
  539. isset($vv['type']) ? $old_data[$k]['type'] = $vv['type'] : ''; //当时图片类型时保留
  540. }
  541. }
  542. }
  543. $save_ext = array_values($save_ext);
  544. $return_data = [];
  545. if (!empty($save_ext) && !empty($old_data)){
  546. $return_data = array_merge($save_ext, $old_data);
  547. } elseif (!empty($old_data)){
  548. $return_data = $old_data;
  549. } elseif (!empty($save_ext)) {
  550. $return_data = $save_ext;
  551. }
  552. return $return_data;
  553. }
  554. //查询修改值的字段
  555. public function check_old_updatefield($cusdata,$save_ext,$new_ext,$token)
  556. {
  557. $old_ext = $this->get_old_ext();
  558. $ext = json_decode($cusdata['ext'],true);
  559. // 数据的旧ext处理
  560. $xin = [];
  561. foreach ($ext as $key => $val) {
  562. foreach ($old_ext as $k => $v) {
  563. if ($k == $key) {
  564. $a['name'] = $v;
  565. $a['value'] = $val;
  566. }
  567. }
  568. $xin[] = $a;
  569. }
  570. //旧ext处理成新的ext结构
  571. $old_data = [];
  572. foreach ($xin as $k => $v){
  573. foreach ($new_ext as $kk => $vv){
  574. if ($v['name'] == $vv['name'] && !empty($v['value'])) {
  575. $old_data['id'] = $vv['id'];
  576. $old_data['keyname'] = $vv['keyname'];
  577. $old_data['value'] = $v['value'];
  578. }
  579. }
  580. }
  581. $old_data = json_decode($cusdata['ext'],true);
  582. $yes_save = [];
  583. foreach ($old_data as $k => $v) {
  584. foreach ($save_ext as $kk => $vv) {
  585. if ($v['id'] == $vv['id']) {
  586. //判断是否修改了数据
  587. if (!isset($vv['type']) && $v['value'] != $vv['value']) {
  588. $yes_save[] = $vv;
  589. }
  590. //判断图片类型的数据是否修改
  591. if (isset($vv['type']) && !empty($vv['value'])) {
  592. $newval = json_decode($vv['value'], true);
  593. $files = $isbreak = null;
  594. foreach ($newval as $kkk => $vvv) {
  595. if (!empty($vvv['serverId'])) {
  596. $yes_save[] = $vv;
  597. $isbreak = 1;
  598. break;
  599. } else {
  600. $img = $vv['img'] ?? '';
  601. }
  602. $files .= $img . ',';
  603. }
  604. if ($isbreak != 1 && $files != $v['value']) {
  605. $yes_save[] = $vv;
  606. }
  607. }
  608. unset($save_ext[$kk]);
  609. }
  610. }
  611. }
  612. //去除为空值的新字段
  613. foreach($save_ext as $key=>$val){
  614. if(empty($val['value'])){
  615. unset($save_ext[$key]);
  616. }
  617. }
  618. $save_ext = array_values($save_ext);
  619. $yes_data = $yes_save;
  620. if (!empty($save_ext)){
  621. $yes_data = array_merge($yes_save,$save_ext);
  622. }
  623. if(!empty($yes_data)) $this->save_field_log($yes_data,$cusdata,$token);
  624. }
  625. //查询修改值的字段
  626. public function check_new_updatefield($cusdata,$save_ext,$token)
  627. {
  628. $old_data = json_decode($cusdata['ext'],true);
  629. $yes_save = [];
  630. foreach ($old_data as $k => $v) {
  631. foreach ($save_ext as $kk => $vv) {
  632. if ($v['id'] == $vv['id']) {
  633. //判断是否修改了数据
  634. if (!isset($vv['type']) && $v['value'] != $vv['value']) {
  635. $yes_save[] = $vv;
  636. }
  637. //判断图片类型的数据是否修改
  638. if (isset($vv['type']) && !empty($vv['value'])) {
  639. $newval = json_decode($vv['value'], true);
  640. //$newval = $vv['value'];
  641. $files = $isbreak = null;
  642. foreach ($newval as $kkk => $vvv) {
  643. if (!empty($vvv['serverId'])) {
  644. $yes_save[] = $vv;
  645. $isbreak = 1;
  646. break;
  647. } else {
  648. $img = $vvv['img'] ?? '';
  649. }
  650. $files .= $img . ',';
  651. }
  652. if ($isbreak != 1 && trim($files,',') != $v['value']) {
  653. $yes_save[] = $vv;
  654. }
  655. }
  656. unset($save_ext[$kk]);
  657. }
  658. }
  659. }
  660. //去除为空值的新字段
  661. foreach($save_ext as $key=>$val){
  662. if(empty($val['value'])){
  663. unset($save_ext[$key]);
  664. }
  665. }
  666. $save_ext = array_values($save_ext);
  667. $yes_data = $yes_save;
  668. if (!empty($save_ext)){
  669. $yes_data = array_merge($yes_save,$save_ext);
  670. }
  671. // var_dump($yes_data);
  672. // exit;
  673. if(!empty($yes_data)) $this->save_field_log($yes_data,$cusdata,$token);
  674. }
  675. //新添加字段时的处理
  676. public function check_not_updatefield($cusdata,$save_ext,$token)
  677. {
  678. $yes_save = [];
  679. foreach($save_ext as $key=>$val){
  680. if(!empty($val['value'])){
  681. $yes_save[] = $val;
  682. }
  683. }
  684. if(!empty($yes_save)) $this->save_field_log($yes_save,$cusdata,$token);
  685. }
  686. //处理修改字段的记录
  687. public function save_field_log($yes_data,$cusdata,$token)
  688. {
  689. //$token = $this->request->token;
  690. $save_ids = array_column($yes_data,'id');
  691. $is_down = 0;
  692. $new_ext = CustomerPortraitField::with(['select'])->where([['root_id', '=', $token['root_org']], ['pid', '<>', 0],['id','in',$save_ids]])->select()->toArray();
  693. $city = Company::where('root_id', $token['root_org'])->value('city');
  694. foreach($new_ext as $key=>$val) {
  695. if ($val['keyname'] == 'current_region') {
  696. $new_ext[$key]['select'][] = ['id' => $token['root_org'], 'name' => $city, 'pid' => $val['id']];
  697. }
  698. if ($val['keyname'] == 'source_id') {
  699. $new_ext[$key]['select'] = CustomerSource::field('id,source as name')->where('root_id', $token['root_org'])->select()->toArray();
  700. }
  701. if ($val['keyname'] == 'deco_style') {
  702. $new_ext[$key]['select'] = Decostyle::field('id,name')->where([['root_id', '=', $token['root_org']], ['type', '=', 0]])->select()->toArray();
  703. }
  704. }
  705. foreach($yes_data as $key=>$val){
  706. $selname1 = null;
  707. $yes_data[$key]['valname'] = $val['value'];
  708. foreach($new_ext as $k=>$v){
  709. if($v['id']==$val['id']){
  710. if($v['type']==6) $is_down = 1;
  711. $yes_data[$key]['name'] = $v['name'];
  712. $yes_data[$key]['type'] = $v['type'];
  713. if (in_array($v['type'], [3, 4]) && !empty($val['value'])) {
  714. $sp = explode(',', (string)$val['value']);
  715. foreach ($v['select'] as $w => $q) {
  716. if (in_array($q['id'], $sp)) {
  717. $selname1 .= $q['name'] . ',';
  718. }
  719. }
  720. $yes_data[$key]['valname'] = trim($selname1, ',');
  721. }
  722. }
  723. }
  724. }
  725. // 添加追踪记录
  726. $visitLog = [
  727. 'customer_id' => $cusdata->id,
  728. 'type' => 1,
  729. 'next_contact_date' => null,
  730. 'employee_id' => $token['employee_id'],
  731. 'user_id' => $token['uid'],
  732. 'remark' => '修改客户扩展信息',
  733. 'state' => 1,
  734. 'org_id' => $token['org_id'],
  735. 'customer_employee_id' => $cusdata->employee_id,
  736. 'customer_org_id' => Employee::where('id', $cusdata->employee_id)->value('org_id'),
  737. 'save_portrait_field' =>json_encode($yes_data),
  738. 'down_portrait_field_status' => $is_down ? $is_down : 0
  739. ];
  740. CustomerVisitLog::create($visitLog);
  741. }
  742. }