EngineerSettlementLogic.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  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\master_worker;
  15. use app\common\enum\worker\WorkerAccountLogEnum;
  16. use app\common\logic\WorkerAccountLogLogic;
  17. use app\common\model\finance\MasterWorkerCaseOutLog;
  18. use app\common\model\financial\FinancialPaymentRecords;
  19. use app\common\model\financial\MasterSettlementDetails;
  20. use app\common\model\master_worker\EngineerSettlement;
  21. use app\common\logic\BaseLogic;
  22. use app\common\model\master_worker\MasterWorker;
  23. use think\facade\Db;
  24. /**
  25. * EngineerSettlement逻辑
  26. * Class EngineerSettlementLogic
  27. * @package app\adminapi\logic
  28. */
  29. class EngineerSettlementLogic extends BaseLogic
  30. {
  31. /**
  32. * @notes 添加
  33. * @param array $params
  34. * @return bool
  35. * @author likeadmin
  36. * @date 2024/11/15 17:21
  37. */
  38. public static function add(array $params, $adminId): bool
  39. {
  40. Db::startTrans();
  41. try {
  42. foreach ($params as $param) {
  43. //$param['payment_status'] == 1 默认上传的都是已经打款了
  44. $engineerSettlement = EngineerSettlement::where('master_worker_id', $param['master_worker_id'])
  45. ->where('batch_number', $param['batch_number'])
  46. ->where('is_export', 1)
  47. ->where('is_deduction', 0)
  48. ->where('payment_status', 0)
  49. ->findOrEmpty();
  50. if(!$engineerSettlement->isEmpty()){
  51. $masterWorker = MasterWorker::where('id', $param['master_worker_id'])->where('worker_number', $param['worker_number'])->find();
  52. if($masterWorker && $masterWorker->user_money >= $param['total_settlement_amount']){
  53. //$masterWorker->user_money = $masterWorker->user_money - $param['total_settlement_amount'];
  54. //$masterWorker->save();
  55. //实发扣款
  56. if($param['final_settlement_amount']){
  57. $final_res = WorkerAccountLogLogic::masterAccountLog($param['master_worker_id'],(float)$param['final_settlement_amount'],WorkerAccountLogEnum::UM_DEC_ADMIN,WorkerAccountLogEnum::DEC, '实发扣款','',[
  58. 'engineerSettlementId'=>$engineerSettlement->id,
  59. 'batch_number'=>$param['batch_number'],
  60. ]);
  61. if($final_res->id){
  62. MasterSettlementDetails::create([
  63. 'account_log_id' => $final_res->id,
  64. 'payment_time' => $param['settlement_time']??date('Y-m-d H:i:s'),
  65. 'batch_number' => $param['batch_number'],
  66. 'status' => 3,
  67. 'master_worker_id' => $param['master_worker_id'],
  68. 'amount_change' => -(float)$param['final_settlement_amount'],
  69. 'change_time' => time(),
  70. 'remark' => '实发扣款'
  71. ]);
  72. }
  73. }
  74. //直接扣款
  75. if($param['deduction_amount']){
  76. $deduction_res = WorkerAccountLogLogic::masterAccountLog($param['master_worker_id'],(float)$param['deduction_amount'],WorkerAccountLogEnum::UM_DEC_ADMIN,WorkerAccountLogEnum::DEC, '直接扣款','',[
  77. 'engineerSettlementId'=>$engineerSettlement->id,
  78. 'batch_number'=>$param['batch_number'],
  79. ]);
  80. if($deduction_res->id){
  81. MasterSettlementDetails::create([
  82. 'account_log_id' => $deduction_res->id,
  83. 'payment_time' => $param['settlement_time']??date('Y-m-d H:i:s'),
  84. 'batch_number' => $param['batch_number'],
  85. 'status' => 3,
  86. 'master_worker_id' => $param['master_worker_id'],
  87. 'amount_change' => -(float)$param['final_settlement_amount'],
  88. 'change_time' => time(),
  89. 'remark' => '直接扣款'
  90. ]);
  91. }
  92. }
  93. // 提现记录
  94. $case_remark = '应发:'.$param['total_settlement_amount'].($param['deduction_amount']>0?',扣款:'.$param['deduction_amount'].',扣款说明:'.$param['deduction_describe']:'').',实发:'.$param['final_settlement_amount'];
  95. MasterWorkerCaseOutLog::create([
  96. 'sn' => generate_sn(MasterWorkerCaseOutLog::class,'sn'),
  97. 'worker_id' => $masterWorker->id,
  98. 'title' => '财务打款',
  99. 'change_amount' => $param['total_settlement_amount'],
  100. 'review_status' => 3,
  101. 'admin_id' => $adminId,
  102. 'remark' => '财务打款-'.$case_remark,
  103. 'create_time' => time(),
  104. 'update_time' => time(),
  105. ]);
  106. $engineerSettlement->deduction_amount = $param['deduction_amount']??0;
  107. $engineerSettlement->deduction_describe = $param['deduction_describe']??'';
  108. $engineerSettlement->final_settlement_amount = $param['final_settlement_amount']??0;
  109. $engineerSettlement->settlement_time = $param['settlement_time']??date('Y-m-d H:i:s');
  110. $engineerSettlement->settlement_details_remarks = $param['settlement_details_remarks']??'';
  111. $engineerSettlement->new_balance = $masterWorker->user_money;
  112. $engineerSettlement->payment_status = 1;
  113. $engineerSettlement->is_export = 2;
  114. $engineerSettlement->admin_id = $adminId;
  115. $engineerSettlement->is_deduction = 1;
  116. $engineerSettlement->save();
  117. MasterSettlementDetails::where('master_worker_id', $param['master_worker_id'])
  118. ->where('batch_number', $param['batch_number'])
  119. ->where('status', 2)
  120. ->update([
  121. 'payment_status' => 1,
  122. 'payment_time' => $param['settlement_time']??date('Y-m-d H:i:s'),
  123. 'status'=>3, 'remark'=>''
  124. ]);
  125. }else{
  126. $engineerSettlement->deduction_amount = $param['deduction_amount']??0;
  127. $engineerSettlement->deduction_describe = $param['deduction_describe']??'';
  128. $engineerSettlement->final_settlement_amount = $param['final_settlement_amount']??0;
  129. $engineerSettlement->settlement_time = $param['settlement_time']??date('Y-m-d H:i:s');
  130. $engineerSettlement->settlement_details_remarks = ($param['settlement_details_remarks']??'').'-余额不足';
  131. $engineerSettlement->new_balance = $masterWorker->user_money;
  132. $engineerSettlement->payment_status = 1;
  133. $engineerSettlement->is_export = 2;
  134. $engineerSettlement->admin_id = $adminId;
  135. $engineerSettlement->is_deduction = 2;
  136. $engineerSettlement->save();
  137. //throw new \Exception('工程师不存在、余额不足');
  138. }
  139. }
  140. }
  141. $payment_num = MasterSettlementDetails::where('batch_number', $params[0]['batch_number'])->where('status','<', 3)->count('id');
  142. FinancialPaymentRecords::where('batch_number', $params[0]['batch_number'])
  143. ->where('upload_status', 1)
  144. ->where('payment_status', 1)
  145. ->update([
  146. 'upload_status' => 3,
  147. 'payment_status'=> $payment_num>0?2:3
  148. ]);
  149. Db::commit();
  150. return true;
  151. } catch (\Exception $e) {
  152. Db::rollback();
  153. self::setError($e->getMessage());
  154. return false;
  155. }
  156. }
  157. /**
  158. * @notes 编辑
  159. * @param array $params
  160. * @return bool
  161. * @author likeadmin
  162. * @date 2024/11/15 17:21
  163. */
  164. public static function edit(array $params): bool
  165. {
  166. Db::startTrans();
  167. try {
  168. EngineerSettlement::where('id', $params['id'])->update([
  169. 'master_worker_id' => $params['master_worker_id'],
  170. 'worker_number' => $params['worker_number'],
  171. 'engineer_name' => $params['engineer_name'],
  172. 'original_balance' => $params['original_balance'],
  173. 'total_settlement_amount' => $params['total_settlement_amount'],
  174. 'deduction_amount' => $params['deduction_amount'],
  175. 'final_settlement_amount' => $params['final_settlement_amount'],
  176. 'settlement_time' => $params['settlement_time'],
  177. 'settlement_details_remarks' => $params['settlement_details_remarks'],
  178. ]);
  179. Db::commit();
  180. return true;
  181. } catch (\Exception $e) {
  182. Db::rollback();
  183. self::setError($e->getMessage());
  184. return false;
  185. }
  186. }
  187. /**
  188. * @notes 删除
  189. * @param array $params
  190. * @return bool
  191. * @author likeadmin
  192. * @date 2024/11/15 17:21
  193. */
  194. public static function delete(array $params): bool
  195. {
  196. return EngineerSettlement::destroy($params['id']);
  197. }
  198. /**
  199. * @notes 获取详情
  200. * @param $params
  201. * @return array
  202. * @author likeadmin
  203. * @date 2024/11/15 17:21
  204. */
  205. public static function detail($params): array
  206. {
  207. return EngineerSettlement::findOrEmpty($params['id'])->toArray();
  208. }
  209. public static function downloadLists(): array
  210. {
  211. return [EngineerSettlement::where('id','>',0)
  212. ->field(['id', 'master_worker_id', 'worker_number', 'engineer_name', 'original_balance', 'total_settlement_amount', 'deduction_amount', 'final_settlement_amount', 'settlement_time', 'settlement_details_remarks'])
  213. ->order(['id' => 'desc'])
  214. ->select()
  215. ->toArray()[0]];
  216. }
  217. public static function engineerSettlementValidate($params)
  218. {
  219. //
  220. //上传表格中所有批号必须相同
  221. //$engineerSettlement 中每条都不能为空
  222. // $masterWorker->user_money >= $param['total_settlement_amount']
  223. //$param['total_settlement_amount'] = $params['final_settlement_amount']+deduction_amount;
  224. try {
  225. if(empty($params)) throw new \Exception('表格数据为空');
  226. //上传表格中所有 master_worker_id 不能存在重复
  227. if(count(array_unique(array_column($params, 'master_worker_id')))>1){
  228. throw new \Exception('上传表格中所有 master_worker_id 必须不能存在重复');
  229. }
  230. //上传表格中所有批号必须相同
  231. if(count(array_unique(array_column($params, 'batch_number')))>1){
  232. throw new \Exception('上传表格中所有批号必须相同');
  233. }
  234. // 每条数据在表 EngineerSettlement 中不能为空
  235. $engineer_worker_ids = EngineerSettlement::where('batch_number', $params[0]['batch_number'])
  236. ->where('is_export', 1)
  237. ->where('is_deduction', 0)
  238. ->where('payment_status', 0)
  239. ->column('master_worker_id');
  240. foreach ($params as &$param) {
  241. if(!in_array($param['master_worker_id'], $engineer_worker_ids)) throw new \Exception('工程师不存在');
  242. //判断日期时间格式是否正确 2024/1/1 00:00:00 或 2024-1-1 00:00:00
  243. if(!preg_match('/^[0-9]{4}\/[0-9]{1,2}\/[0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}$/', $param['settlement_time'])
  244. && !preg_match('/^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}$/', $param['settlement_time'])){
  245. throw new \Exception('日期时间格式错误');
  246. }else{
  247. $param['settlement_time'] = date('Y-m-d H:i:s', strtotime($param['settlement_time']));
  248. }
  249. if(!is_numeric($param['original_balance']) || !is_numeric($param['total_settlement_amount']) || !is_numeric($param['deduction_amount']) || !is_numeric($param['final_settlement_amount'])){
  250. throw new \Exception('金额格式错误');
  251. }
  252. if(!preg_match('/^[0-9]*$/', $param['worker_number'])){
  253. throw new \Exception('工程师编号格式错误:'.$param['worker_number']);
  254. }
  255. if(!preg_match('/^[0-9]*$/', $param['master_worker_id'])){
  256. throw new \Exception('工程师ID格式错误:'.$param['master_worker_id']);
  257. }
  258. $masterWorker = MasterWorker::where('id', $param['master_worker_id'])->where('worker_number', $param['worker_number'])->findOrEmpty();
  259. if($masterWorker->isEmpty()) throw new \Exception('工程师不存在:'.$param['master_worker_id']);
  260. if($masterWorker->user_money < $param['total_settlement_amount']) throw new \Exception('余额不足');
  261. }
  262. return $params;
  263. } catch (\Exception $e) {
  264. throw new \Exception($e->getMessage());
  265. }
  266. }
  267. }