OrderEffectiveLogLogic.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | likeadmin快速开发前后端分离管理后台(PHP版)
  4. // +----------------------------------------------------------------------
  5. // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
  6. // | 开源版本可自由商用,可去除界面版权logo
  7. // | gitee下载:https://gitee.com/likeshop_gitee/likeadmin
  8. // | github下载:https://github.com/likeshop-github/likeadmin
  9. // | 访问官网:https://www.likeadmin.cn
  10. // | likeadmin团队 版权所有 拥有最终解释权
  11. // +----------------------------------------------------------------------
  12. // | author: likeadminTeam
  13. // +----------------------------------------------------------------------
  14. namespace app\adminapi\logic\effective;
  15. use app\adminapi\logic\works\ServiceWorkLogic;
  16. use app\common\enum\GoodsEnum;
  17. use app\common\enum\PayEnum;
  18. use app\common\enum\WorkEnum;
  19. use app\common\enum\worker\WorkerAccountLogEnum;
  20. use app\common\model\orders\OrderEffectiveLog;
  21. use app\common\logic\BaseLogic;
  22. use app\common\model\goods\Goods;
  23. use app\common\model\master_worker\MasterWorkerAccountLog;
  24. use app\common\model\master_worker\MasterWorkerRetentionMoneyLog;
  25. use app\common\model\orders\RechargeOrder;
  26. use app\common\model\recharge\OrderGoods;
  27. use app\common\model\service_area\ServiceArea;
  28. use app\common\model\works\ServiceWork;
  29. use think\facade\Db;
  30. /**
  31. * OrderEffectiveLog逻辑
  32. * Class OrderEffectiveLogLogic
  33. * @package app\adminapi\logic
  34. */
  35. class OrderEffectiveLogLogic extends BaseLogic
  36. {
  37. /**
  38. * @notes 添加
  39. * @param array $params
  40. * @return bool
  41. * @author likeadmin
  42. * @date 2025/01/17 11:10
  43. */
  44. public static function add(array $params): bool
  45. {
  46. Db::startTrans();
  47. try {
  48. OrderEffectiveLog::create([
  49. 'effective_id' => $params['effective_id'],
  50. 'sn' => $params['sn'],
  51. 'user_id' => $params['user_id'],
  52. 'work_id' => $params['work_id'],
  53. 'goods_id' => $params['goods_id'],
  54. 'effective_unit' => $params['effective_unit'],
  55. 'effective_num' => $params['effective_num'],
  56. 'remark' => $params['remark'],
  57. 'end_effective_time' => $params['end_effective_time'],
  58. ]);
  59. Db::commit();
  60. return true;
  61. } catch (\Exception $e) {
  62. Db::rollback();
  63. self::setError($e->getMessage());
  64. return false;
  65. }
  66. }
  67. /**
  68. * @notes 编辑
  69. * @param array $params
  70. * @return bool
  71. * @author likeadmin
  72. * @date 2025/01/17 11:10
  73. */
  74. public static function edit(array $params): bool
  75. {
  76. if($params['operation_type'] == 1){
  77. //无需保修 - 恢复状态
  78. OrderEffectiveLog::where('id', $params['id'])->update([
  79. 'effective_status' => 0,
  80. 'effective_time' => 0,
  81. ]);
  82. return true;
  83. }
  84. // 用户已提交 - 客服处理下单
  85. if($params['edit_status'] == 1){
  86. self::effectiveServiceWork($params);
  87. }
  88. // 保修中 - 客服处理新增定金 ,尾款可由工程师完成 =0 || >0 均可
  89. if($params['edit_status'] == 2){
  90. // 惩罚金额
  91. OrderEffectiveLog::where('id', $params['id'])->update([
  92. 'penalty_amount' => $params['penalty_amount']
  93. ]);
  94. }
  95. return true;
  96. }
  97. /**
  98. * @notes 删除
  99. * @param array $params
  100. * @return bool
  101. * @author likeadmin
  102. * @date 2025/01/17 11:10
  103. */
  104. public static function delete(array $params): bool
  105. {
  106. return OrderEffectiveLog::destroy($params['id']);
  107. }
  108. /**
  109. * @notes 获取详情
  110. * @param $params
  111. * @return array
  112. * @author likeadmin
  113. * @date 2025/01/17 11:10
  114. */
  115. public static function detail($params): array
  116. {
  117. return OrderEffectiveLog::findOrEmpty($params['id'])->toArray();
  118. }
  119. /**
  120. * @notes 计算工单所得的 提成+质保金
  121. */
  122. public static function commissionAndAssuranceDeposit($serviceWork)
  123. {
  124. $change_amount = MasterWorkerAccountLog::where([
  125. 'change_object'=>WorkerAccountLogEnum::UM,'change_type'=>WorkerAccountLogEnum::UM_INC_ADMIN,
  126. 'action'=>WorkerAccountLogEnum::INC,'worker_id'=>$serviceWork['master_worker_id'],
  127. 'work_sn'=>$serviceWork['work_sn']])->value('change_amount');
  128. $retentionAmount = MasterWorkerRetentionMoneyLog::where(['action'=>WorkerAccountLogEnum::INC,'source'=>2,'worker_id'=>$serviceWork['master_worker_id'],'work_id'=>$serviceWork['id']])->value('amount');
  129. return bcadd((string)$change_amount,(string)$retentionAmount,2);
  130. }
  131. /**
  132. * @notes 用户已提交 - 客服处理下单
  133. */
  134. public static function effectiveServiceWork($params)
  135. {
  136. Db::startTrans();
  137. try {
  138. /*{ name: '无需保修', value: 1 },
  139. { name: '原工程师修复', value: 2 },
  140. { name: '新工程师修复', value: 3 }*/
  141. $effectiveLog = OrderEffectiveLog::where('id', $params['id'])->find();
  142. /*$effectiveLog['user_id']
  143. $effectiveLog['work_id']
  144. $effectiveLog['goods_id']*/
  145. // 原工单信息 $effectiveLog['work_id']
  146. $serviceWork = ServiceWork::find($effectiveLog['work_id'])->toArray();
  147. if($params['operation_type'] == 2){
  148. //原工程师修复
  149. OrderEffectiveLog::where('id', $params['id'])->update([
  150. 'effective_status' => 2
  151. ]);
  152. // 原工程师为0
  153. $service_fee = 0;
  154. $master_worker_id = $serviceWork['master_worker_id'];
  155. }else if($params['operation_type'] == 3){
  156. //新工程师修复
  157. OrderEffectiveLog::where('id', $params['id'])->update([
  158. 'effective_status' => 2
  159. ]);
  160. // 计算原工程师的原工单的提成+质保金
  161. //$service_fee = self::commissionAndAssuranceDeposit($serviceWork);
  162. $service_fee = 0;
  163. if($serviceWork['master_worker_id'] == $params['master_worker_id']){
  164. throw new \Exception('请选择新的工程师');
  165. }
  166. $master_worker_id = $params['master_worker_id'];
  167. }else{
  168. throw new \Exception('操作类型错误');
  169. }
  170. //生成服务工单
  171. $work_data = [
  172. 'work_sn' => generate_sn(ServiceWork::class, 'work_sn'),
  173. 'real_name' => $serviceWork['real_name'],
  174. 'mobile' => $serviceWork['mobile'],
  175. 'address' => $serviceWork['address'],
  176. 'province' => $serviceWork['province']??0,
  177. 'city' => $serviceWork['city']??0,
  178. 'area_name' => $serviceWork['area_name']??'',
  179. 'service_area_id' => $serviceWork['service_area_id']??0,
  180. 'title' => $serviceWork['title']??'',
  181. 'category_type' => $serviceWork['category_type'],
  182. 'goods_category_ids' => $serviceWork['goods_category_ids'],
  183. 'goods_category_id' => $serviceWork['goods_category_id'],
  184. 'user_id'=>$serviceWork['user_id'],
  185. 'lon'=>$serviceWork['lon'],
  186. 'lat'=>$serviceWork['lat'],
  187. 'property_activity_id'=>0,
  188. 'user_equity_id'=>0,
  189. 'work_pay_status'=>WorkEnum::IS_PAY_STATUS,
  190. 'appointment_time' => $params['appointment_time']?strtotime($params['appointment_time']):0,
  191. 'order_effective_id'=>$params['id'],
  192. 'base_service_fee' => 0,
  193. 'service_fee' => 0,
  194. 'work_total'=>0,
  195. 'work_amount'=>0,
  196. ];
  197. $service_work = ServiceWork::create($work_data);
  198. //生成支付订单
  199. $data = [
  200. 'work_id'=> $service_work['id'],
  201. 'sn' => generate_sn(RechargeOrder::class, 'sn'),
  202. 'order_type'=>0,//服务订单
  203. 'order_terminal' => 1,
  204. 'payment_type'=>1,
  205. 'user_id' => $serviceWork['user_id'],
  206. 'pay_way' => 2,
  207. 'pay_status' => PayEnum::ISPAID,
  208. 'pay_time' => time(),
  209. 'paid_amount' => 0,
  210. 'coupon_id'=>0,
  211. 'coupon_price'=>0,
  212. 'order_total' => 0,
  213. 'order_amount' => 0,
  214. ];
  215. $order = RechargeOrder::create($data);
  216. //生成订单服务详情
  217. $goods = Goods::findOrEmpty($effectiveLog['goods_id']);
  218. OrderGoods::create([
  219. 'sn' => $order['sn'],
  220. 'goods_id' => $effectiveLog['goods_id'],
  221. 'category_type' => $goods['category_type'],
  222. 'goods_category_ids' => $goods['goods_category_ids'],
  223. 'goods_category_id' => $goods['goods_category_id'],
  224. 'goods_name' => $goods['goods_name'],
  225. 'goods_image' => $goods['goods_image'],
  226. 'goods_video' => $goods['goods_video'],
  227. 'goods_number' => $goods['goods_number'],
  228. 'good_unit' => $goods['good_unit'],
  229. 'goods_size' => $goods['goods_size'],
  230. 'goods_type' => $goods['goods_type'],
  231. 'goods_brand' => $goods['goods_brand'],
  232. 'install_guide' => $goods['install_guide'],
  233. 'goods_payment_type'=>1,
  234. 'base_service_fee' => $goods['base_service_fee'],
  235. 'service_total' => $goods['service_total'],
  236. 'service_fee' => $goods['service_fee'],
  237. 'service_image' => $goods['service_image'],
  238. 'warranty_period'=>$goods['warranty_period'],
  239. 'fee_schedule' => $goods['fee_schedule'],
  240. 'goods_status' => $goods['goods_status'],
  241. 'is_show' => 0,
  242. ]);
  243. Db::commit();
  244. //派单
  245. if(isset($service_work['id']) && !empty($service_work['id'])) ServiceWorkLogic::allocateWorker(['id'=>$service_work['id'],'master_worker_id'=>$master_worker_id],$params['adminInfo']);
  246. return true;
  247. } catch (\Exception $e) {
  248. Db::rollback();
  249. self::setError($e->getMessage());
  250. return false;
  251. }
  252. }
  253. }