OrderEffectiveLogLogic.php 10 KB

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