StaffSalary.php 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889
  1. <?php
  2. //namespace app\api\controller;
  3. //
  4. ////use app\common\controller\Api;
  5. ////use \think\Request;
  6. ////use think\Db;
  7. ////use app\service\InsertDataJob;
  8. ////use think\Queue;
  9. ////use think\Cache;
  10. ////use think\cache\driver\Redis;
  11. ////use function fast\e;
  12. //
  13. //use app\common\controller\Api;
  14. //use \think\Request;
  15. //use think\Db;
  16. //use app\job\InsertDataJob;
  17. //use think\Queue;
  18. //use think\Cache;
  19. //use think\cache\driver\Redis;
  20. ///**
  21. // * 员工计件工资核算
  22. // */
  23. //class StaffSalary extends Api
  24. //{
  25. // protected $noNeedLogin = ['*'];
  26. // protected $noNeedRight = ['*'];
  27. //
  28. // /**
  29. // * 首页
  30. // *
  31. // */
  32. // public function index()
  33. // {
  34. // $this->success('请求成功');
  35. // }
  36. // /**
  37. // * 计算员工计件工资
  38. // * @ApiMethod POST
  39. // * @param string date 考勤年月
  40. // * @param string start_date 开始日期
  41. // * @param string end_date 结束日期
  42. // * @param string vacation_one_start 法定假日1 开始时间
  43. // * @param string vacation_one_end 法定假日1 结束时间
  44. // * @param string vacation_two_start 法定假日2 开始时间
  45. // * @param string vacation_two_end 法定假日2 结束时间
  46. // */
  47. // public function staffSalaryCount(){
  48. // if (Request::instance()->isPost() == false){
  49. // $this->error('非法请求');
  50. // }
  51. // $params = Request::instance()->param();
  52. // if (!isset($params['start_date']) || !isset($params['end_date']) || empty($params['start_date']) || empty($params['end_date']) || !isset($params['date']) || empty($params['date']))
  53. // {
  54. // $this->error('参数错误');
  55. // }
  56. // $startDate = $params['start_date'];
  57. // $endDate = $params['end_date'];
  58. // $attendanceMonth = $params['date'];
  59. // // 确保开始日期和结束日期在考勤年月的范围内
  60. // $startDateInRange = date('Ym', strtotime($startDate)) === $attendanceMonth;
  61. // $endDateInRange = date('Ym', strtotime($endDate)) === $attendanceMonth;
  62. // if (!$startDateInRange || !$endDateInRange) {
  63. // $this->error('日期参数错误');
  64. // }
  65. // $options = [
  66. // 'host' => '127.0.0.1',
  67. // 'port' => 6379,
  68. // 'password' => '123456',
  69. // 'select' => 15,
  70. // 'timeout' => 0,
  71. // 'expire' => 0,
  72. // 'persistent' => false,
  73. // 'prefix' => '',
  74. // ];
  75. // $redis = new Redis($options);
  76. //// $taskIdentifier = md5(json_encode('date'));
  77. //// $queueKey = $redis->get($taskIdentifier);
  78. //// if ($queueKey){
  79. //// $this->success('数据正在处理中,请等待...');
  80. //// }
  81. // $taskIdentifier = md5('salary_calculation_' . json_encode($params));
  82. //
  83. // if ($redis->has($taskIdentifier)) {
  84. // $this->success('数据正在处理中,请等待...');
  85. // }
  86. // $vacationOneArr = [];
  87. // if (!empty($params['vacation_one_start']) && !empty($params['vacation_one_end'])){
  88. // $vacationOneStart = strtotime($params['vacation_one_start']);
  89. // $vacationOneEnd = strtotime($params['vacation_one_end']);
  90. // for ($i=$vacationOneStart; $i<=$vacationOneEnd; $i+=86400)
  91. // {
  92. // array_push($vacationOneArr,date("Y-m-d", $i));
  93. // }
  94. // }
  95. // $vacationTwoArr = [];
  96. // if (!empty($params['vacation_two_start']) && !empty($params['vacation_two_end'])){
  97. // $vacationTwoStart = strtotime($params['vacation_two_start']);
  98. // $vacationTwoEnd = strtotime($params['vacation_two_end']);
  99. // for ($i=$vacationTwoStart; $i<=$vacationTwoEnd; $i+=86400)
  100. // {
  101. // array_push($vacationTwoArr,date("Y-m-d", $i));
  102. // }
  103. // }
  104. // //法定天数
  105. // $clocking_in_day = \db('人事_考勤资料')->where('kqzl_ny',$params['date'])->field('法定天数')->order('UniqId desc')->find();
  106. // if (!empty($clocking_in_day)){
  107. // $params['days'] = (int)$clocking_in_day['法定天数'];
  108. // }else{
  109. // $this->error('法定天数未设置');
  110. // }
  111. // //将起止日期内数据删除
  112. // $delRes = \db('绩效工资汇总')->where('sczl_rq','between',[$startDate,$endDate])->delete();
  113. // //设备产量计酬报工数据查询
  114. // $where = [];
  115. // $where['a.sczl_rq'] = ['between',[$startDate,$endDate]];
  116. // //查询印刷印后车间的机台,添加搜索条件
  117. // $sist = ['胶印车间','凹丝印车间','印后车间','检验车间'];
  118. // $jtbhs = db('设备_基本资料')
  119. // ->where('sys_sbID','<>','')
  120. // ->where('使用部门','in',$sist)
  121. // ->column('设备编号');
  122. // $fields = "a.sczl_gdbh,a.sczl_yjno,a.sczl_gxh,a.sczl_type as sczl_type,a.sczl_rq,a.sczl_jtbh,a.sczl_工价系数,a.sczl_ms,a.sczl_cl as 班组车头产量,a.sczl_Pgcl,a.sczl_zcfp,
  123. // a.sczl_装版工时 as 装版工时,a.sczl_保养工时 as 保养工时,a.sczl_打样工时 as 打样工时,a.sczl_异常工时1 as 异常停机工时,a.sczl_设备运行工时 as 车头产量占用机时,
  124. // a.sczl_bh1,a.sczl_bh2,a.sczl_bh3,a.sczl_bh4,a.sczl_bh5,a.sczl_bh6,a.sczl_bh7,a.sczl_bh8,a.sczl_bh9,a.sczl_bh10,
  125. // a.sczl_rate1,a.sczl_rate2,a.sczl_rate3,a.sczl_rate4,a.sczl_rate5,a.sczl_rate6,a.sczl_rate7,a.sczl_rate8,a.sczl_rate9,a.sczl_rate10,
  126. // a.sczl_废品率系数,a.UniqId,
  127. // b.千件工价,b.日定额,b.补产标准,c.工价系数 as 工序难度系数,c.版距,c.印刷方式
  128. // ,d1.员工姓名 as name1,d2.员工姓名 as name2,d3.员工姓名 as name3,d4.员工姓名 as name4,d5.员工姓名 as name5,d6.员工姓名 as name6,d7.员工姓名 as name7,d8.员工姓名 as name8
  129. // ,d9.员工姓名 as name9,d10.员工姓名 as name10";
  130. // $query = Db::name('设备_产量计酬')->alias('a')->field($fields);
  131. // // 连接 dic_lzde 表
  132. // $query->join('dic_lzde b', 'a.sczl_dedh = b.sys_bh', 'LEFT');
  133. // // 连接 工单_工艺资料 表
  134. // $query->join('工单_工艺资料 c', 'a.sczl_gdbh = c.Gy0_gdbh AND a.sczl_yjno = c.Gy0_yjno AND a.sczl_gxh = c.Gy0_gxh', 'LEFT');
  135. // // 循环连接 人事_基本资料 表(仅当 sczl_bh 不为空时才连接)
  136. // for ($i = 1; $i <= 10; $i++) {
  137. // $field = 'a.sczl_bh' . $i;
  138. // $alias = 'd' . $i;
  139. // $query->join("人事_基本资料 $alias", "$field = {$alias}.员工编号 AND {$field} IS NOT NULL", 'LEFT');
  140. // }
  141. // $query->where($where)->where('a.sczl_jtbh','in',$jtbhs);
  142. // $list = $query->order('a.sczl_rq')->group('UniqId')->select();
  143. // $UniqId = \db('绩效工资汇总')->field('UniqID')->order('UniqID desc')->find();
  144. // if (empty($UniqId)){
  145. // $UniqId = 1;
  146. // }else{
  147. // $UniqId = $UniqId['UniqID'] + 1;
  148. // }
  149. // $data = [];
  150. // /**
  151. // * 设备_产量计酬数据
  152. // */
  153. // foreach ($list as $value){
  154. // $num = 1;
  155. // $value['班组车头产量'] = $value['班组车头产量'] - $value['sczl_zcfp'];
  156. // //计件产量
  157. // if (substr($value['sczl_jtbh'],0,2) == 'JP'){//检品机
  158. // if ($value['sczl_废品率系数'] == 0){
  159. // $gx_rate = 1;
  160. // }else{
  161. // $gx_rate = $value['sczl_废品率系数'];
  162. // }
  163. // $value['班组车头产量'] = $value['班组车头产量'] * $value['sczl_Pgcl'];
  164. // $byThePieceYield = round($value['班组车头产量'] * $value['sczl_废品率系数']);//班组计件核算产量
  165. // }elseif (substr($value['sczl_jtbh'],0,2) == 'WY' || substr($value['sczl_jtbh'],0,2) == 'DW' || substr($value['sczl_jtbh'],0,3) == 'YWY' || substr($value['sczl_jtbh'],0,3) == 'YDW'){//凹印机
  166. // if ($value['sczl_工价系数'] == '0.000' || floatval($value['sczl_工价系数']) <= 0){
  167. // //工序难度系数
  168. // $gx_rate = $value['工序难度系数'];
  169. // if (floatval($value['工序难度系数']) <= 0 || empty($value['工序难度系数'])){
  170. // $gx_rate = '1.0000';
  171. // }
  172. // }else{
  173. // if (floatval($value['工序难度系数']) > 0 ){
  174. // $gx_rate = number_format($value['sczl_工价系数'] * $value['工序难度系数'],3);
  175. // }else{
  176. // $gx_rate = $value['sczl_工价系数'];
  177. // }
  178. // }
  179. // if (str_contains($value['印刷方式'],'张') && $value['版距'] > 0){
  180. // $value['版距'] = $value['版距'] / 1000;
  181. // $value['班组车头产量'] = $value['班组车头产量'] * $value['版距'];
  182. // }
  183. //// $byThePieceYield = round($value['班组车头产量'] * $gx_rate);
  184. // $byThePieceYield =str_replace(',','',round($value['班组车头产量'] * floatval($gx_rate))) ;
  185. // }else{
  186. // if ($value['sczl_jtbh'] === 'YSY02#' || $value['sczl_jtbh'] === 'YSY08#' || $value['sczl_jtbh'] === 'YSY10#' || $value['sczl_jtbh'] === 'SY03#'){
  187. // $num = 1.1;
  188. // }
  189. // if ($value['sczl_工价系数'] == '0.000' || floatval($value['sczl_工价系数']) <= 0){
  190. // //工序难度系数
  191. // $gx_rate = $value['工序难度系数'];
  192. // if (floatval($value['工序难度系数']) <= 0 || empty($value['工序难度系数'])){
  193. // $gx_rate = '1.0000';
  194. // }
  195. // }else{
  196. // if (floatval($value['工序难度系数']) > 0 ){
  197. // $gx_rate = number_format($value['sczl_工价系数'] * $value['工序难度系数'],3);
  198. // }else{
  199. // $gx_rate = $value['sczl_工价系数'];
  200. // }
  201. // }
  202. // $byThePieceYield =round($value['班组车头产量'] * floatval($gx_rate) * $num);
  203. //
  204. // }
  205. //// //计件产量
  206. //// if (substr($value['sczl_jtbh'],0,2) == 'JP'){
  207. //// $value['工序难度系数'] = $value['sczl_废品率系数'];
  208. //// $value['班组车头产量'] = $value['班组车头产量'] * $value['sczl_Pgcl'];
  209. //// $byThePieceYield = round($value['班组车头产量'] * $value['sczl_废品率系数']);
  210. //// }else{
  211. //// if ($value['工序难度系数'] <= 0 || empty($value['工序难度系数'])){
  212. //// $value['工序难度系数'] = '1.0000';
  213. //// $byThePieceYield = $value['班组车头产量'];
  214. //// }else{
  215. //// $byThePieceYield = round($value['班组车头产量'] * $value['工序难度系数']);
  216. //// }
  217. //// }
  218. // //补产产量/班组换算产量
  219. // $afterProductionYield = ($value['装版工时'] + $value['保养工时'] + $value['打样工时']) * $value['补产标准'];
  220. // //核算产量
  221. // $accountingYield = $byThePieceYield + $afterProductionYield;
  222. // //工时占比
  223. // if ($value['日定额'] > 0){
  224. // $manHourRate = number_format($accountingYield / $value['日定额'],4);
  225. // }else{
  226. // $manHourRate = '0.0000';
  227. // }
  228. // for ($i=1; $i<11; $i++){
  229. // $bhKey = 'sczl_bh'.$i;
  230. // $xmKey = 'name'.$i;
  231. // $rateKey = 'sczl_rate'.$i;
  232. // if (!empty($value[$bhKey]) && $value[$bhKey] != '0000'){
  233. // $item = [];
  234. // $item['sczl_gdbh'] = $value['sczl_gdbh'];
  235. // $item['sczl_yjno'] = $value['sczl_yjno'];
  236. // $item['sczl_gxh'] = $value['sczl_gxh'];
  237. //// $item['sczl_type'] = substr($value['sczl_type'],0,30);
  238. // $item['sczl_type'] = $value['sczl_type'];
  239. // $item['sczl_rq'] = $value['sczl_rq'];
  240. // $item['sczl_jtbh'] = $value['sczl_jtbh'];
  241. // $item['班组车头产量'] = $value['班组车头产量'];
  242. // $item['工价系数'] = '0.0000';
  243. // $item['工序难度系数'] = $gx_rate * $num;
  244. // $item['装版工时'] = $value['装版工时'];
  245. // $item['保养工时'] = $value['保养工时'];
  246. // $item['打样工时'] = $value['打样工时'];
  247. // $item['异常停机工时'] = $value['异常停机工时'];
  248. // $item['车头产量占用机时'] = $value['车头产量占用机时'];
  249. // $item['日定额'] = (int)$value['日定额'];
  250. // $item['千件工价'] = $value['千件工价'];
  251. // $item['补产标准'] = $value['补产标准'];
  252. // $item['班组换算产量'] = $afterProductionYield;
  253. // $item['计时补差额工资'] = '0.00';
  254. // $item['bh'] = $value[$bhKey];
  255. // $item['xm'] = $value[$xmKey];
  256. // $item['Rate'] = $value[$rateKey];
  257. // $item['sczl_ms'] = $value['sczl_ms'];
  258. // $item['核算产量'] = $accountingYield;
  259. // $item['工时占比'] = $manHourRate;
  260. // array_push($data,$item);
  261. // }
  262. // }
  263. // }
  264. //// halt($data);
  265. // /**
  266. // * 拆片工序数据
  267. // */
  268. // $query = Db::name('db_sczl')->alias('a')
  269. // ->field('a.sczl_gdbh, a.sczl_yjno, a.sczl_gxh, sczl_type, a.sczl_rq, a.sczl_jtbh,
  270. // a.sczl_ms, a.sczl_cl as 班组车头产量, a.sczl_fp as sczl_zcfp, a.sczl_装版工时 as 装版工时, a.sczl_保养工时 as 保养工时,
  271. // a.sczl_打样工时 as 打样工时, a.sczl_异常停机工时 as 异常停机工时, a.sczl_设备运行工时 as 车头产量占用机时, a.sczl_bh1,
  272. // a.sczl_rate1, b.千件工价, b.日定额, b.补产标准,a.sczl_工价系数 as 工序难度系数,a.拆片联拼系数,a.拆片条小盒系数, d.员工姓名')
  273. // ->join('dic_lzde b', 'a.sczl_dedh = b.sys_bh','left')
  274. // ->join('工单_工艺资料 c', 'a.sczl_gdbh = c.Gy0_gdbh AND a.sczl_yjno = c.Gy0_yjno AND a.sczl_gxh = c.Gy0_gxh','left')
  275. // ->join('人事_基本资料 d', 'a.sczl_bh1 = d.员工编号','left')
  276. // ->where($where)
  277. // ->select();
  278. // foreach ($query as $value){
  279. // $num = 1;
  280. // $value['班组车头产量'] = ($value['班组车头产量'] - $value['sczl_zcfp']) * $value['拆片联拼系数'] * $value['拆片条小盒系数'];
  281. // //计件产量
  282. // if ($value['sczl_jtbh'] === 'YSY02#' || $value['sczl_jtbh'] === 'YSY08#' || $value['sczl_jtbh'] === 'YSY10#' || $value['sczl_jtbh'] === 'SY03#'){
  283. // $num = 1.1;
  284. // }
  285. // if ($value['工序难度系数'] <= 0 || empty($value['工序难度系数'])){
  286. // $value['工序难度系数'] = '1.0000';
  287. // $byThePieceYield = $value['班组车头产量'];
  288. // }else{
  289. // $byThePieceYield = round($value['班组车头产量'] * $value['工序难度系数'] * $num);
  290. // }
  291. // //补产产量/班组换算产量
  292. // $afterProductionYield = ($value['装版工时'] + $value['保养工时'] + $value['打样工时']) * $value['补产标准'];
  293. // //核算产量
  294. // $accountingYield = $byThePieceYield + $afterProductionYield;
  295. // //工时占比
  296. // if ($value['日定额'] > 0){
  297. // $manHourRate = number_format($accountingYield / $value['日定额'],4);
  298. // }else{
  299. // $manHourRate = '0.0000';
  300. // }
  301. // $item = [];
  302. // $item['sczl_gdbh'] = $value['sczl_gdbh'];
  303. // $item['sczl_yjno'] = $value['sczl_yjno'];
  304. // $item['sczl_gxh'] = $value['sczl_gxh'];
  305. //// $item['sczl_type'] = substr(trim($value['sczl_type']),0,30);
  306. // $item['sczl_type'] = $value['sczl_type'];
  307. // $item['sczl_rq'] = $value['sczl_rq'];
  308. // $item['sczl_jtbh'] = $value['sczl_jtbh'];
  309. // $item['班组车头产量'] = $value['班组车头产量'];
  310. // $item['工价系数'] = '0.0000';
  311. // $item['工序难度系数'] = $value['工序难度系数'] * $num;
  312. // $item['装版工时'] = $value['装版工时'];
  313. // $item['保养工时'] = $value['保养工时'];
  314. // $item['打样工时'] = $value['打样工时'];
  315. // $item['异常停机工时'] = $value['异常停机工时'];
  316. // $item['车头产量占用机时'] = $value['车头产量占用机时'];
  317. // $item['日定额'] = (int)$value['日定额'];
  318. // $item['千件工价'] = $value['千件工价'];
  319. // $item['补产标准'] = $value['补产标准'];
  320. // $item['班组换算产量'] = $afterProductionYield;
  321. // $item['计时补差额工资'] = '0.00';
  322. // $item['bh'] = $value['sczl_bh1'];
  323. // $item['xm'] = $value['员工姓名'];
  324. // $item['Rate'] = $value['sczl_rate1'];
  325. // $item['sczl_ms'] = $value['sczl_ms'];
  326. // $item['核算产量'] = $accountingYield;
  327. // $item['工时占比'] = floatval($manHourRate);
  328. // array_push($data,$item);
  329. // }
  330. //// halt($data);
  331. // /**
  332. // * 手工检验工序数据
  333. // */
  334. // $shoujianfields = "a.sczl_gdbh,a.sczl_yjgx,sczl_gxmc AS sczl_type,a.sczl_rq,a.sczl_cl AS 班组车头产量,
  335. // sczl_废品率系数 AS 工序难度系数,a.sczl_bh0,a.sczl_bh1,a.sczl_bh2,a.sczl_bh3,a.sczl_bh4,a.sczl_bh5,a.sczl_bh6,
  336. // a.sczl_bh7,a.sczl_bh8,a.sczl_bh9,a.sczl_bh10,a.sczl_bh11,b.千件工价,b.日定额,b.补产标准,d0.员工姓名 AS name0,
  337. // d1.员工姓名 AS name1,d2.员工姓名 AS name2,d3.员工姓名 AS name3,d4.员工姓名 AS name4,d5.员工姓名 AS name5,
  338. // d6.员工姓名 AS name6,d7.员工姓名 AS name7,d8.员工姓名 AS name8,d9.员工姓名 AS name9,d10.员工姓名 AS name10,
  339. // d10.员工姓名 AS name11,d10.员工姓名 AS name12,a.sczl_cl0,a.sczl_cl1,a.sczl_cl2,a.sczl_cl3,a.sczl_cl4,a.sczl_cl5,a.sczl_cl6,
  340. // a.sczl_cl7,a.sczl_cl8,a.sczl_cl9,a.sczl_cl10,a.sczl_cl11,a.sczl_cl12,a.sczl_fp0,a.sczl_fp1,a.sczl_fp2,a.sczl_fp3,
  341. // a.sczl_fp4,a.sczl_fp5,a.sczl_fp6,a.sczl_fp7,a.sczl_fp8,a.sczl_fp9,a.sczl_fp10,a.sczl_fp11,a.sczl_fp12";
  342. // $query = Db::name('db_手工检验')->alias('a')->field($shoujianfields);
  343. // //链接dic_lzde表
  344. // $query->join('dic_lzde b','a.sczl_dedh = b.sys_bh','LEFT');
  345. // //链接人事基本资料表
  346. // for ($i=0;$i<=12;$i++){
  347. // $field = 'a.sczl_bh'.$i;
  348. // $alias = 'd'.$i;
  349. // $query->join("人事_基本资料 $alias", "$field = {$alias}.员工编号 AND {$field} IS NOT NULL", 'LEFT');
  350. // }
  351. // $query->where($where);
  352. // $list = $query->select();
  353. // foreach ($list as $key=>$value){
  354. // for ($i=0;$i<=12;$i++){
  355. // if (!empty($value['sczl_bh'.$i])){
  356. // $value['sczl_yjno'] = (int)substr($value['sczl_yjgx'],0,2);
  357. // $value['sczl_gxh'] = (int)substr($value['sczl_yjgx'],3,2);
  358. // //车头产量
  359. // $value['班组车头产量'] = $value['sczl_cl'.$i]*$value['sczl_fp'.$i];
  360. // //计件产量
  361. // if ($value['工序难度系数'] <= 0 || empty($value['工序难度系数'])){
  362. // $value['工序难度系数'] = '1.0000';
  363. // $value['计件产量'] = $value['班组车头产量'];
  364. // }else{
  365. // $value['计件产量'] = round($value['班组车头产量'] * $value['工序难度系数']);
  366. // }
  367. // //核算产量
  368. // $value['核算产量'] = $value['计件产量'];
  369. // //工时占比
  370. // if ($value['日定额'] > 0){
  371. // $value['工时占比'] = round($value['计件产量']/$value['日定额'],4);
  372. // }else{
  373. // $value['工时占比'] = '0.0000';
  374. // }
  375. // $item = [];
  376. // $item['sczl_gdbh'] = $value['sczl_gdbh'];
  377. // $item['sczl_yjno'] = $value['sczl_yjno'];
  378. // $item['sczl_gxh'] = $value['sczl_gxh'];
  379. //// $item['sczl_type'] = substr($value['sczl_type'],0,30);
  380. // $item['sczl_type'] = $value['sczl_type'];
  381. // $item['sczl_rq'] = $value['sczl_rq'];
  382. // $item['sczl_jtbh'] = '';
  383. // $item['班组车头产量'] = $value['班组车头产量'];
  384. // $item['工价系数'] = '0.0000';
  385. // $item['工序难度系数'] = $value['工序难度系数'];
  386. // $item['装版工时'] = '0.00';
  387. // $item['保养工时'] = '0.00';
  388. // $item['打样工时'] = '0.00';
  389. // $item['异常停机工时'] = '0.00';
  390. // $item['车头产量占用机时'] = '0.00';
  391. // $item['日定额'] = (int)$value['日定额'];
  392. // $item['千件工价'] = $value['千件工价'];
  393. // $item['补产标准'] = $value['补产标准'];
  394. // $item['班组换算产量'] = '0';
  395. // $item['计时补差额工资'] = '0.00';
  396. // $item['bh'] = $value['sczl_bh'.$i];
  397. // $item['xm'] = $value['name'.$i];
  398. // $item['Rate'] = '1.0000';
  399. // $item['sczl_ms'] = '0.00';
  400. // $item['核算产量'] = $value['核算产量'];
  401. // $item['工时占比'] = floatval($value['工时占比']);
  402. // array_push($data,$item);
  403. // }
  404. // }
  405. // }
  406. //// halt($data);
  407. // /**
  408. // * 包装计件工序数据
  409. // */
  410. // $result = Db::name('db_包装计件')->alias('a')
  411. // ->field('a.sczl_gdbh1, a.sczl_gdbh2, a.sczl_gdbh3, a.sczl_gdbh4, a.sczl_gdbh5, a.sczl_gdbh6,
  412. // a.sczl_yjGx1, a.sczl_yjGx2, a.sczl_yjGx3, a.sczl_yjGx4, a.sczl_yjGx5, a.sczl_yjGx6,
  413. // rtrim(a.sczl_gxmc1) as gxmc1,rtrim(a.sczl_gxmc2) as gxmc2,rtrim(a.sczl_gxmc3) as gxmc3,rtrim(a.sczl_gxmc4) as gxmc4,rtrim(a.sczl_gxmc5) as gxmc5,rtrim(a.sczl_gxmc6) as gxmc6,
  414. // a.sczl_cl1, a.sczl_cl2, a.sczl_cl3, a.sczl_cl4, a.sczl_cl5, a.sczl_cl6,
  415. // a.sczl_返工产量1, a.sczl_返工产量2, a.sczl_返工产量3, a.sczl_返工产量4, a.sczl_返工产量5, a.sczl_返工产量6,
  416. // a.sczl_Jtbh1,a.sczl_Jtbh2,a.sczl_Jtbh3,a.sczl_Jtbh4,a.sczl_Jtbh5,a.sczl_Jtbh6,
  417. // a.sczl_dedh1,a.sczl_dedh2,a.sczl_dedh3,a.sczl_dedh4,a.sczl_dedh5,a.sczl_dedh6,
  418. // a.sczl_PgCl1,a.sczl_PgCl2,a.sczl_PgCl3,a.sczl_PgCl4,a.sczl_PgCl5,a.sczl_PgCl6,
  419. // a.sczl_type1,a.sczl_type2,sczl_type3,a.sczl_type4,a.sczl_type5,sczl_type6,
  420. // a.sczl_计产系数1,a.sczl_计产系数2,a.sczl_计产系数3,a.sczl_计产系数4,a.sczl_计产系数5,a.sczl_计产系数6,
  421. // c1.工价系数 as 工序难度系数1,c2.工价系数 as 工序难度系数2,c3.工价系数 as 工序难度系数3,c4.工价系数 as 工序难度系数4,c5.工价系数 as 工序难度系数5,c6.工价系数 as 工序难度系数6,
  422. // b1.千件工价 as 千件工价1, b2.千件工价 as 千件工价2, b3.千件工价 as 千件工价3, b4.千件工价 as 千件工价4, b5.千件工价 as 千件工价5, b6.千件工价 as 千件工价6,
  423. // b1.日定额 as 日定额1, b2.日定额 as 日定额2, b3.日定额 as 日定额3, b4.日定额 as 日定额4, b5.日定额 as 日定额5, b6.日定额 as 日定额6,
  424. // b1.补产标准 as 补产标准1, b2.补产标准 as 补产标准2, b3.补产标准 as 补产标准3, b4.补产标准 as 补产标准4, b5.补产标准 as 补产标准5, b6.补产标准 as 补产标准6,
  425. // a.sczl_rq,a.sczl_bh,rtrim(d.员工姓名) as xm,
  426. // e1.成品名称 as cpmc1,e2.成品名称 as cpmc2,e3.成品名称 as cpmc3,e4.成品名称 as cpmc4,e5.成品名称 as cpmc5,e6.成品名称 as cpmc6')
  427. // ->join('工单_工艺资料 c1', 'a.sczl_gdbh1 = c1.Gy0_gdbh AND a.sczl_yjGx1 = CONCAT("0",c1.Gy0_yjno, "-", c1.Gy0_gxh) AND a.sczl_gdbh1 IS NOT NULL', 'LEFT')
  428. // ->join('工单_工艺资料 c2', 'a.sczl_gdbh2 = c2.Gy0_gdbh AND a.sczl_yjGx2 = CONCAT("0",c2.Gy0_yjno, "-", c2.Gy0_gxh) AND a.sczl_gdbh2 IS NOT NULL', 'LEFT')
  429. // ->join('工单_工艺资料 c3', 'a.sczl_gdbh3 = c3.Gy0_gdbh AND a.sczl_yjGx3 = CONCAT("0",c3.Gy0_yjno, "-", c3.Gy0_gxh) AND a.sczl_gdbh3 IS NOT NULL', 'LEFT')
  430. // ->join('工单_工艺资料 c4', 'a.sczl_gdbh4 = c4.Gy0_gdbh AND a.sczl_yjGx4 = CONCAT("0",c4.Gy0_yjno, "-", c4.Gy0_gxh) AND a.sczl_gdbh4 IS NOT NULL', 'LEFT')
  431. // ->join('工单_工艺资料 c5', 'a.sczl_gdbh5 = c5.Gy0_gdbh AND a.sczl_yjGx5 = CONCAT("0",c5.Gy0_yjno, "-", c5.Gy0_gxh) AND a.sczl_gdbh5 IS NOT NULL', 'LEFT')
  432. // ->join('工单_工艺资料 c6', 'a.sczl_gdbh6 = c6.Gy0_gdbh AND a.sczl_yjGx6 = CONCAT("0",c6.Gy0_yjno, "-", c6.Gy0_gxh) AND a.sczl_gdbh6 IS NOT NULL', 'LEFT')
  433. // ->join('dic_lzde b1', 'a.sczl_dedh1 = b1.sys_bh', 'LEFT')
  434. // ->join('dic_lzde b2', 'a.sczl_dedh2 = b2.sys_bh', 'LEFT')
  435. // ->join('dic_lzde b3', 'a.sczl_dedh3 = b3.sys_bh', 'LEFT')
  436. // ->join('dic_lzde b4', 'a.sczl_dedh4 = b4.sys_bh', 'LEFT')
  437. // ->join('dic_lzde b5', 'a.sczl_dedh5 = b5.sys_bh', 'LEFT')
  438. // ->join('dic_lzde b6', 'a.sczl_dedh6 = b6.sys_bh', 'LEFT')
  439. // ->join('人事_基本资料 d', 'a.sczl_bh = d.员工编号', 'LEFT')
  440. // ->join('工单_基本资料 e1','a.sczl_gdbh1 = e1.Gd_gdbh AND a.sczl_gdbh1 IS NOT NULL','LEFT')
  441. // ->join('工单_基本资料 e2','a.sczl_gdbh2 = e2.Gd_gdbh AND a.sczl_gdbh2 IS NOT NULL','LEFT')
  442. // ->join('工单_基本资料 e3','a.sczl_gdbh3 = e3.Gd_gdbh AND a.sczl_gdbh3 IS NOT NULL','LEFT')
  443. // ->join('工单_基本资料 e4','a.sczl_gdbh4 = e4.Gd_gdbh AND a.sczl_gdbh4 IS NOT NULL','LEFT')
  444. // ->join('工单_基本资料 e5','a.sczl_gdbh5 = e5.Gd_gdbh AND a.sczl_gdbh5 IS NOT NULL','LEFT')
  445. // ->join('工单_基本资料 e6','a.sczl_gdbh6 = e6.Gd_gdbh AND a.sczl_gdbh6 IS NOT NULL','LEFT')
  446. // ->where($where)
  447. // ->group('a.UniqId')
  448. // ->select();
  449. //
  450. // foreach ($result as $value){
  451. // for ($i=1;$i<7;$i++){
  452. // $item = [];
  453. // $gdbhKey = 'sczl_gdbh'.$i;
  454. // $yjgxKey = 'sczl_yjGx'.$i;
  455. // $jtbhKey = 'sczl_Jtbh'.$i;
  456. // $gxmcKey = 'gxmc'.$i;
  457. // $clKey = 'sczl_cl'.$i;
  458. // $reworkKey = 'sczl_返工产量'.$i;
  459. // $gxKey = '工序难度系数'.$i;
  460. // $dedh = 'sczl_dedh'.$i;
  461. // $thousandKey = '千件工价'.$i;
  462. // $dailyKey = '日定额'.$i;
  463. // $afterKey = '补产标准'.$i;
  464. // $pgclKey = 'sczl_PgCl'.$i;
  465. // $jcxsKey = 'sczl_计产系数'.$i;
  466. // $cpmcKey = 'cpmc'.$i;
  467. // $typekey = 'sczl_type'.$i;
  468. // if (!empty($value[$gdbhKey])){
  469. // $item['sczl_gdbh'] = $value[$gdbhKey];
  470. // $item['sczl_yjno'] = ltrim(substr($value[$yjgxKey],0,2), '0');
  471. // $item['sczl_gxh'] = abs((int)substr($value[$yjgxKey],-2));
  472. //// $item['sczl_type'] = substr($value[$gxmcKey],0,30);
  473. // $item['sczl_type'] = $value[$gxmcKey];
  474. // $item['sczl_rq'] = $value['sczl_rq'];
  475. // $item['sczl_jtbh'] = $value[$jtbhKey];
  476. // $item['工价系数'] = '0.0000';
  477. // $item['工序难度系数'] = $value[$jcxsKey];
  478. // if ($value[$jcxsKey] <= 0){
  479. // $item['工序难度系数'] = '1.0000';
  480. // }
  481. // $item['装版工时'] = '0.00';
  482. // $item['保养工时'] = '0.00';
  483. // $item['打样工时'] = '0.00';
  484. // $item['异常停机工时'] = '0.00';
  485. // $item['车头产量占用机时'] = '0.00';
  486. // $item['日定额'] = $value[$dailyKey];
  487. // $item['千件工价'] = $value[$thousandKey];
  488. // $item['补产标准'] = $value[$afterKey];
  489. // $item['班组换算产量'] = '0.00';
  490. // $item['计时补差额工资'] = '0.00';
  491. // $item['bh'] = $value['sczl_bh'];
  492. // $item['xm'] = $value['xm'];
  493. // $item['Rate'] = 1.000;
  494. // $item['sczl_ms'] = '0.00';
  495. // $cl = $value[$clKey];
  496. // if ($cl > 0){
  497. // if (str_contains($item['sczl_type'],'包装')){
  498. // $item['班组车头产量'] = $cl * $value[$pgclKey] / (int)$value[$typekey];
  499. // }else{
  500. // $item['班组车头产量'] = $cl;
  501. // }
  502. // $item['核算产量'] = $item['班组车头产量'] * $item['工序难度系数'];
  503. // //工时占比
  504. // if ($item['日定额'] > 0){
  505. // $manHourRate = number_format($item['核算产量'] / $item['日定额'],4);
  506. // }else{
  507. // $manHourRate = '0.0000';
  508. // }
  509. // $item['工时占比'] = floatval($manHourRate);
  510. // array_push($data,$item);
  511. // }
  512. // //返工
  513. // if (!empty($value[$reworkKey]) && $value[$reworkKey] > 0){
  514. // $item['sczl_type'] = '返工('.$item['sczl_type'].')';
  515. // $cl = $value[$reworkKey];
  516. // if (str_contains($item['sczl_type'],'包装')){
  517. // $item['班组车头产量'] = $cl * $value[$pgclKey] / (int)$value[$typekey];
  518. // }else{
  519. // $item['班组车头产量'] = $cl;
  520. // }
  521. // $item['核算产量'] = $item['班组车头产量'] * $item['工序难度系数'];
  522. // if ($item['日定额'] > 0){
  523. // $manHourRate = number_format($item['核算产量'] / $item['日定额'],4);
  524. // }else{
  525. // $manHourRate = '0.0000';
  526. // }
  527. // $item['工时占比'] = floatval($manHourRate);
  528. // array_push($data,$item);
  529. // }
  530. //
  531. // }
  532. // }
  533. // }
  534. ////halt($data);
  535. // //用于存储bh对应的工时占比总和
  536. // $bhTotals = [];
  537. // // 遍历原始数据
  538. // foreach ($data as $row) {
  539. // $bh = substr($row['sczl_rq'],0,10) . '-' .$row['bh'];
  540. // // 初始化bh对应的工时占比总和为0
  541. // if (!isset($bhTotals[$bh])) {
  542. // $bhTotals[$bh] = 0;
  543. // }
  544. // // 将工时占比相加
  545. // $bhTotals[$bh] += floatval($row['工时占比']);
  546. // }
  547. // //用usort函数对$data数组按照sczl_rq的日期部分进行升序排序
  548. // usort($data, function ($a, $b) {
  549. // return strtotime(substr($a['sczl_rq'], 0, 10)) - strtotime(substr($b['sczl_rq'], 0, 10));
  550. // });
  551. // $days = [];
  552. // foreach ($data as $key=>$item){
  553. // //统计每月出勤天数
  554. // $day_bh = $item['bh'];
  555. // if (!isset($days[$day_bh])){
  556. // $days[$day_bh] = [];
  557. // array_push($days[$day_bh],$item['sczl_rq']);
  558. // }else{
  559. // if (in_array($item['sczl_rq'],$days[$day_bh]) == false){
  560. // array_push($days[$day_bh],$item['sczl_rq']);
  561. // }
  562. // }
  563. // $bh = substr($item['sczl_rq'],0,10) . '-' .$item['bh'];
  564. // //达标定额
  565. // if ($item['工时占比'] > 0){
  566. // $standardQuota = floatval($item['工时占比'] / $bhTotals[$bh] * $item['日定额']);
  567. // $data[$key]['达标定额'] = number_format($standardQuota,2,'.', '');
  568. // }else{
  569. // $data[$key]['达标定额'] = number_format($item['班组车头产量'],2,'.', '');
  570. // }
  571. // $date = substr($item['sczl_rq'],0,10);
  572. // if (in_array($date,$vacationOneArr) || in_array($date,$vacationTwoArr)){
  573. // //计件工资
  574. //// $pieceWorkWage = $data[$key]['达标定额']/1000*$item['千件工价']*$item['Rate']*3;
  575. // $pieceWorkWage = 0;
  576. // //加班工资
  577. // $overTimePay = $item['核算产量'] / 1000 *$item['千件工价'] * $item['Rate'] *3;
  578. // //法定节假日,去除这天的考勤天数
  579. // $days[$day_bh] = array_filter($days[$day_bh], function($value) use ($item) {
  580. // return $value !== $item['sczl_rq'];
  581. // });
  582. // }else{
  583. //// //如果出勤天数小于法定天数,按正常计算
  584. //// if (count($days[$day_bh]) <= $params['days'] && strpos($item['sczl_type'],'成品防护') === false){
  585. //// $pieceWorkWage = $data[$key]['达标定额']/1000*$item['千件工价']*$item['Rate'];
  586. //// }else{ //如果出勤天数大于法定天数,达标定额为 0,计件工资为0,超出的部分按加班工资算
  587. //// $data[$key]['达标定额'] = '0.00';
  588. //// $pieceWorkWage = '0.00';
  589. //// }
  590. //// $overTimePay = ($item['核算产量'] - $data[$key]['达标定额']) / 1000 *$item['千件工价'] * $item['Rate'] *1.5;
  591. //
  592. // // 基础计件工资计算公式
  593. // $baseWage = ($data[$key]['达标定额'] / 1000) * $item['千件工价'] * $item['Rate'];
  594. //
  595. // // 当有成品防护类型时(直接通过)
  596. // if (strpos($item['sczl_type'], '成品防护') !== false) {
  597. // $pieceWorkWage = $baseWage;
  598. // }
  599. // // 没有特殊类型时
  600. // else {
  601. // // 转换为数值类型避免计算错误
  602. // $standardQuota = (float)$data[$key]['达标定额'];
  603. // // 判断出勤天数是否超限
  604. // if (count($days[$day_bh]) > $params['days']) {
  605. // // 超限时重置定额
  606. // $data[$key]['达标定额'] = '0.00';
  607. // $pieceWorkWage = '0.00';
  608. // $standardQuota = 0; // 同步数值类型
  609. // } else {
  610. // $pieceWorkWage = $baseWage;
  611. // }
  612. // }
  613. // // 统一计算加班工资(所有情况都会计算)
  614. //// $actualOutput = (float)$item['核算产量'];
  615. //// $overtimeOutput = max($actualOutput - (float)$data[$key]['达标定额'], 0);
  616. //// $overTimePay = ($overtimeOutput / 1000) * $item['千件工价'] * $item['Rate'] * 1.5;
  617. // $overTimePay = ($item['核算产量'] - $data[$key]['达标定额']) / 1000 *$item['千件工价'] * $item['Rate'] *1.5;
  618. // }
  619. // $data[$key]['个人计件工资'] = number_format($pieceWorkWage,2,'.', '');
  620. // $data[$key]['个人加班工资'] = number_format($overTimePay,2,'.', '');
  621. // $data[$key]['UniqID'] = $UniqId++;
  622. // $data[$key]['sys_ny'] = $params['date'];
  623. // $data[$key]['sys_rq'] = date('Y-m-d H:i:s');
  624. // $data[$key]['sys_id'] = $params['sys_id'];
  625. // $data[$key]['法定天数'] = $params['days'];
  626. // $data[$key]['sczl_type'] = trim($item['sczl_type']);
  627. // }
  628. //
  629. // // 检查任务是否已经存在于队列中,如果不存在则推送任务到队列
  630. // if (!$redis->has($taskIdentifier)) {
  631. //
  632. // // 在提交队列任务前,先记录到任务表
  633. // $taskData = [
  634. // 'date' => $params['date'],
  635. // 'start_date' => $startDate,
  636. // 'end_date' => $endDate,
  637. // 'sys_id' => $params['sys_id'] ?? '',
  638. // 'user_id' => session('user_id') ?? 0,
  639. // 'user_name' => session('user_name') ?? '系统',
  640. // 'request_time' => date('Y-m-d H:i:s')
  641. // ];
  642. //
  643. // $taskId = Db::name('queue_tasks')->insertGetId([
  644. // 'task_type' => 'salary_calculation',
  645. // 'task_data' => json_encode($taskData, JSON_UNESCAPED_UNICODE),
  646. // 'status' => 'pending',
  647. // 'queue_name' => 'salary_calculation',
  648. // 'create_time' => date('Y-m-d H:i:s')
  649. // ]);
  650. //
  651. // // 将任务ID添加到任务数据中
  652. // $taskData['task_id'] = $taskId;
  653. //
  654. // // 提交任务到工资计算队列
  655. // $job = new InsertDataJob($data);
  656. //
  657. // // 修改:使用工资计算队列名称
  658. // $queueResult = Queue::push($job, $taskData, 'salary_calculation');
  659. //
  660. // if ($queueResult !== false) {
  661. // // 更新任务记录
  662. // Db::name('queue_tasks')
  663. // ->where('id', $taskId)
  664. // ->update([
  665. // 'job_id' => $queueResult,
  666. // 'update_time' => date('Y-m-d H:i:s')
  667. // ]);
  668. //
  669. // $redis->set($taskIdentifier, true);
  670. // $this->success('数据正在处理中,请等待...');
  671. // }
  672. //// $job = new InsertDataJob($data); // 创建任务实例
  673. //// // 推送任务到队列
  674. //// Queue::push($job,'','default'); // 推送任务到队列
  675. //// // 设置任务的标识符到缓存中,并设置有效期,有效期为队列执行时间的两倍
  676. //// $redis->set($taskIdentifier, true);
  677. //// $this->success('数据正在处理中,请等待...');
  678. // }
  679. // }
  680. //
  681. //
  682. // /**
  683. // * 新增:查询工资计算任务状态
  684. // * @ApiMethod GET
  685. // */
  686. // public function salaryStatus()
  687. // {
  688. // $date = Request::instance()->param('date');
  689. //
  690. // if (empty($date)) {
  691. // $this->error('月份参数错误');
  692. // }
  693. //
  694. // $task = Db::name('queue_tasks')
  695. // ->where('task_type', 'salary_calculation')
  696. // ->where('task_data', 'like', '%"date":"' . $date . '"%')
  697. // ->order('id', 'desc')
  698. // ->find();
  699. //
  700. // if ($task) {
  701. // $taskData = json_decode($task['task_data'] ?? '{}', true);
  702. // $result = json_decode($task['result'] ?? '{}', true);
  703. //
  704. // $this->success('查询成功', null, [
  705. // 'exists' => true,
  706. // 'task_id' => $task['id'],
  707. // 'date' => $date,
  708. // 'status' => $task['status'],
  709. // 'queue_name' => $task['queue_name'],
  710. // 'job_id' => $task['job_id'],
  711. // 'start_time' => $task['start_time'],
  712. // 'end_time' => $task['end_time'],
  713. // 'retry_count' => $task['retry_count'],
  714. // 'result' => $result,
  715. // 'error' => $task['error'] ?? '',
  716. // 'create_time' => $task['create_time'],
  717. // 'user_info' => [
  718. // 'user_id' => $taskData['user_id'] ?? 0,
  719. // 'user_name' => $taskData['user_name'] ?? ''
  720. // ]
  721. // ]);
  722. // } else {
  723. // $this->success('查询成功', null, ['exists' => false, 'date' => $date]);
  724. // }
  725. // }
  726. //}
  727. namespace app\api\controller;
  728. use app\common\controller\Api;
  729. use think\Request;
  730. use think\Db;
  731. use think\Queue;
  732. class StaffSalary extends Api
  733. {
  734. protected $noNeedLogin = ['*'];
  735. protected $noNeedRight = ['*'];
  736. /**
  737. * 计算员工计件工资(队列版本)
  738. */
  739. public function staffSalaryCount()
  740. {
  741. if (Request::instance()->isPost() == false) {
  742. $this->error('非法请求');
  743. }
  744. $params = Request::instance()->param();
  745. // 参数验证
  746. if (empty($params['date']) || empty($params['start_date']) || empty($params['end_date'])) {
  747. $this->error('日期参数不能为空');
  748. }
  749. // 检查是否有正在执行的任务
  750. $runningTask = Db::name('queue_tasks')
  751. ->where('task_type', 'salary_calculation')
  752. ->where('task_data', 'like', '%"date":"' . $params['date'] . '"%')
  753. ->where('status', 'in', ['pending', 'processing'])
  754. ->find();
  755. if ($runningTask) {
  756. $this->success('该月份的工资计算任务已在执行中,请勿重复提交');
  757. }
  758. // 添加用户信息
  759. $params['user_id'] = session('user_id') ?? 0;
  760. $params['user_name'] = session('user_name') ?? '系统';
  761. $params['request_time'] = date('Y-m-d H:i:s');
  762. // 先创建任务记录
  763. $taskId = Db::name('queue_tasks')->insertGetId([
  764. 'task_type' => 'salary_calculation',
  765. 'task_data' => json_encode($params, JSON_UNESCAPED_UNICODE),
  766. 'status' => 'pending',
  767. 'queue_name' => 'salary_calculation',
  768. 'create_time' => date('Y-m-d H:i:s')
  769. ]);
  770. // 添加到任务数据中
  771. $params['task_id'] = $taskId;
  772. // 提交到工资计算队列
  773. $jobHandlerClassName = 'app\job\SalaryCalculationJob';
  774. $queueName = 'salary_calculation';
  775. $jobId = Queue::push($jobHandlerClassName, $params, $queueName);
  776. if ($jobId) {
  777. // 更新任务记录
  778. Db::name('queue_tasks')
  779. ->where('id', $taskId)
  780. ->update([
  781. 'job_id' => $jobId,
  782. 'update_time' => date('Y-m-d H:i:s')
  783. ]);
  784. $this->success('工资计算任务已提交到队列,请稍后查看结果', null, [
  785. 'task_id' => $taskId,
  786. 'job_id' => $jobId,
  787. 'month' => $params['date'],
  788. 'queue_name' => $queueName
  789. ]);
  790. } else {
  791. // 更新任务状态为失败
  792. Db::name('queue_tasks')
  793. ->where('id', $taskId)
  794. ->update([
  795. 'status' => 'failed',
  796. 'error' => '任务提交到队列失败',
  797. 'update_time' => date('Y-m-d H:i:s')
  798. ]);
  799. $this->error('工资计算任务提交失败');
  800. }
  801. }
  802. /**
  803. * 直接执行工资计算(同步版本,用于测试)
  804. */
  805. public function calculateDirect()
  806. {
  807. if (Request::instance()->isPost() == false) {
  808. $this->error('非法请求');
  809. }
  810. $params = Request::instance()->param();
  811. try {
  812. $service = new \app\service\SalaryCalculationService();
  813. $result = $service->calculateSalary($params);
  814. if ($result['success']) {
  815. $this->success($result['message'], null, $result['data']);
  816. } else {
  817. $this->error($result['message']);
  818. }
  819. } catch (\Exception $e) {
  820. $this->error('工资计算失败: ' . $e->getMessage());
  821. }
  822. }
  823. /**
  824. * 查询工资计算状态
  825. */
  826. public function salaryStatus()
  827. {
  828. $date = Request::instance()->param('date');
  829. if (empty($date)) {
  830. $this->error('月份参数错误');
  831. }
  832. $task = Db::name('queue_tasks')
  833. ->where('task_type', 'salary_calculation')
  834. ->where('task_data', 'like', '%"date":"' . $date . '"%')
  835. ->order('id', 'desc')
  836. ->find();
  837. if ($task) {
  838. $taskData = json_decode($task['task_data'] ?? '{}', true);
  839. $result = json_decode($task['result'] ?? '{}', true);
  840. $this->success('查询成功', null, [
  841. 'exists' => true,
  842. 'task_id' => $task['id'],
  843. 'date' => $date,
  844. 'status' => $task['status'],
  845. 'queue_name' => $task['queue_name'],
  846. 'job_id' => $task['job_id'],
  847. 'start_time' => $task['start_time'],
  848. 'end_time' => $task['end_time'],
  849. 'retry_count' => $task['retry_count'],
  850. 'result' => $result,
  851. 'error' => $task['error'] ?? '',
  852. 'create_time' => $task['create_time'],
  853. 'user_info' => [
  854. 'user_id' => $taskData['user_id'] ?? 0,
  855. 'user_name' => $taskData['user_name'] ?? ''
  856. ]
  857. ]);
  858. } else {
  859. $this->success('查询成功', null, ['exists' => false, 'date' => $date]);
  860. }
  861. }
  862. }