StaffSalary.php 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\controller\Api;
  4. use \think\Request;
  5. use think\Db;
  6. use app\job\InsertDataJob;
  7. use think\Queue;
  8. use think\Cache;
  9. use think\cache\driver\Redis;
  10. /**
  11. * 员工计件工资核算
  12. */
  13. class StaffSalary extends Api
  14. {
  15. protected $noNeedLogin = ['*'];
  16. protected $noNeedRight = ['*'];
  17. /**
  18. * 首页
  19. *
  20. */
  21. public function index()
  22. {
  23. $this->success('请求成功');
  24. }
  25. /**
  26. * 计算员工计件工资
  27. * @ApiMethod POST
  28. * @param string date 考勤年月
  29. * @param string start_date 开始日期
  30. * @param string end_date 结束日期
  31. * @param string vacation_one_start 法定假日1 开始时间
  32. * @param string vacation_one_end 法定假日1 结束时间
  33. * @param string vacation_two_start 法定假日2 开始时间
  34. * @param string vacation_two_end 法定假日2 结束时间
  35. */
  36. public function staffSalaryCount(){
  37. if (Request::instance()->isPost() == false){
  38. $this->error('非法请求');
  39. }
  40. $params = Request::instance()->param();
  41. if (!isset($params['start_date']) || !isset($params['end_date']) || empty($params['start_date']) || empty($params['end_date']) || !isset($params['date']) || empty($params['date']))
  42. {
  43. $this->error('参数错误');
  44. }
  45. $startDate = $params['start_date'];
  46. $endDate = $params['end_date'];
  47. $attendanceMonth = $params['date'];
  48. // 确保开始日期和结束日期在考勤年月的范围内
  49. $startDateInRange = date('Ym', strtotime($startDate)) === $attendanceMonth;
  50. $endDateInRange = date('Ym', strtotime($endDate)) === $attendanceMonth;
  51. if (!$startDateInRange || !$endDateInRange) {
  52. $this->error('日期参数错误');
  53. }
  54. $options = [
  55. 'host' => '127.0.0.1',
  56. 'port' => 6379,
  57. 'password' => '123456',
  58. 'select' => 15,
  59. 'timeout' => 0,
  60. 'expire' => 0,
  61. 'persistent' => false,
  62. 'prefix' => '',
  63. ];
  64. $redis = new Redis($options);
  65. $taskIdentifier = md5(json_encode('date'));
  66. $queueKey = $redis->get($taskIdentifier);
  67. if ($queueKey){
  68. $this->success('数据正在处理中,请等待...');
  69. }
  70. $vacationOneArr = [];
  71. if (!empty($params['vacation_one_start']) && !empty($params['vacation_one_end'])){
  72. $vacationOneStart = strtotime($params['vacation_one_start']);
  73. $vacationOneEnd = strtotime($params['vacation_one_end']);
  74. for ($i=$vacationOneStart; $i<=$vacationOneEnd; $i+=86400)
  75. {
  76. array_push($vacationOneArr,date("Y-m-d", $i));
  77. }
  78. }
  79. $vacationTwoArr = [];
  80. if (!empty($params['vacation_two_start']) && !empty($params['vacation_two_end'])){
  81. $vacationTwoStart = strtotime($params['vacation_two_start']);
  82. $vacationTwoEnd = strtotime($params['vacation_two_end']);
  83. for ($i=$vacationTwoStart; $i<=$vacationTwoEnd; $i+=86400)
  84. {
  85. array_push($vacationTwoArr,date("Y-m-d", $i));
  86. }
  87. }
  88. //法定天数
  89. $clocking_in_day = \db('人事_考勤资料')->where('kqzl_ny',$params['date'])->field('法定天数')->order('UniqId desc')->find();
  90. if (!empty($clocking_in_day)){
  91. $params['days'] = (int)$clocking_in_day['法定天数'];
  92. }else{
  93. $this->error('法定天数未设置');
  94. }
  95. //将起止日期内数据删除
  96. $delRes = \db('绩效工资汇总')->where('sczl_rq','between',[$startDate,$endDate])->delete();
  97. $where = [];
  98. $where['a.sczl_rq'] = ['between',[$startDate,$endDate]];
  99. //查询印刷印后车间的机台,添加搜索条件
  100. $jtbhs = db('设备_基本资料')->where('使用部门','in',['印刷车间','印后车间'])->where('sys_sbID','<>','')->column('设备编号');
  101. $fields = "a.sczl_gdbh,a.sczl_yjno,a.sczl_gxh,a.sczl_gxmc as sczl_type,a.sczl_rq,a.sczl_jtbh,a.sczl_工价系数,a.sczl_ms,a.sczl_cl as 班组车头产量,a.sczl_Pgcl,a.sczl_zcfp,
  102. a.sczl_装版工时 as 装版工时,a.sczl_保养工时 as 保养工时,a.sczl_打样工时 as 打样工时,a.sczl_异常工时1 as 异常停机工时,a.sczl_设备运行工时 as 车头产量占用机时,
  103. 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,
  104. 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,
  105. a.sczl_废品率系数,a.UniqId,
  106. b.千件工价,b.日定额,b.补产标准,c.工价系数 as 工序难度系数,c.版距
  107. ,d1.员工姓名 as name1,d2.员工姓名 as name2,d3.员工姓名 as name3,d4.员工姓名 as name4,d5.员工姓名 as name5,d6.员工姓名 as name6,d7.员工姓名 as name7,d8.员工姓名 as name8
  108. ,d9.员工姓名 as name9,d10.员工姓名 as name10";
  109. $query = Db::name('设备_产量计酬')->alias('a')->field($fields);
  110. // 连接 dic_lzde 表
  111. $query->join('dic_lzde b', 'a.sczl_dedh = b.sys_bh', 'LEFT');
  112. // 连接 工单_工艺资料 表
  113. $query->join('工单_工艺资料 c', 'a.sczl_gdbh = c.Gy0_gdbh AND a.sczl_yjno = c.Gy0_yjno AND a.sczl_gxh = c.Gy0_gxh', 'LEFT');
  114. // 循环连接 人事_基本资料 表(仅当 sczl_bh 不为空时才连接)
  115. for ($i = 1; $i <= 10; $i++) {
  116. $field = 'a.sczl_bh' . $i;
  117. $alias = 'd' . $i;
  118. $query->join("人事_基本资料 $alias", "$field = {$alias}.员工编号 AND {$field} IS NOT NULL", 'LEFT');
  119. }
  120. $query->where($where)->where('a.sczl_jtbh','in',$jtbhs);
  121. $list = $query->order('a.sczl_rq')->group('UniqId')->select();
  122. $UniqId = \db('绩效工资汇总')->field('UniqID')->order('UniqID desc')->find();
  123. if (empty($UniqId)){
  124. $UniqId = 1;
  125. }else{
  126. $UniqId = $UniqId['UniqID'] + 1;
  127. }
  128. $data = [];
  129. /**
  130. * 设备_产量计酬数据
  131. */
  132. foreach ($list as $value){
  133. $value['班组车头产量'] = $value['班组车头产量'] - $value['sczl_zcfp'];
  134. //计件产量
  135. if (substr($value['sczl_jtbh'],0,2) == 'JP'){//检品机
  136. $gx_rate = $value['sczl_废品率系数'];
  137. $value['班组车头产量'] = $value['班组车头产量'] * $value['sczl_Pgcl'];
  138. $byThePieceYield = round($value['班组车头产量'] * $value['sczl_废品率系数']);
  139. }elseif (substr($value['sczl_jtbh'],0,2) == 'WY' || substr($value['sczl_jtbh'],0,2) == 'DW'){//凹印机
  140. $gx_rate = $value['工序难度系数'];
  141. if ($value['版距'] > 0){
  142. $value['版距'] = $value['版距'] / 1000;
  143. $value['班组车头产量'] = $value['班组车头产量'] * $value['版距'];
  144. }
  145. $byThePieceYield = round($value['班组车头产量'] * $gx_rate);
  146. }else{
  147. if ($value['sczl_工价系数'] == '0.000' || floatval($value['sczl_工价系数']) <= 0){
  148. //工序难度系数
  149. $gx_rate = $value['工序难度系数'];
  150. if (floatval($value['工序难度系数']) <= 0 || empty($value['工序难度系数'])){
  151. $gx_rate = '1.0000';
  152. }
  153. }else{
  154. if (floatval($value['工序难度系数']) > 0 ){
  155. $gx_rate = number_format($value['sczl_工价系数'] * $value['工序难度系数'],3);
  156. }else{
  157. $gx_rate = $value['sczl_工价系数'];
  158. }
  159. }
  160. $byThePieceYield = round($value['班组车头产量'] * $gx_rate);
  161. }
  162. // //计件产量
  163. // if (substr($value['sczl_jtbh'],0,2) == 'JP'){
  164. // $value['工序难度系数'] = $value['sczl_废品率系数'];
  165. // $value['班组车头产量'] = $value['班组车头产量'] * $value['sczl_Pgcl'];
  166. // $byThePieceYield = round($value['班组车头产量'] * $value['sczl_废品率系数']);
  167. // }else{
  168. // if ($value['工序难度系数'] <= 0 || empty($value['工序难度系数'])){
  169. // $value['工序难度系数'] = '1.0000';
  170. // $byThePieceYield = $value['班组车头产量'];
  171. // }else{
  172. // $byThePieceYield = round($value['班组车头产量'] * $value['工序难度系数']);
  173. // }
  174. // }
  175. //补产产量/班组换算产量
  176. $afterProductionYield = ($value['装版工时'] + $value['保养工时'] + $value['打样工时']) * $value['补产标准'];
  177. //核算产量
  178. $accountingYield = $byThePieceYield + $afterProductionYield;
  179. //工时占比
  180. if ($value['日定额'] > 0){
  181. $manHourRate = number_format($accountingYield / $value['日定额'],4);
  182. }else{
  183. $manHourRate = '0.0000';
  184. }
  185. for ($i=1; $i<11; $i++){
  186. $bhKey = 'sczl_bh'.$i;
  187. $xmKey = 'name'.$i;
  188. $rateKey = 'sczl_rate'.$i;
  189. if (!empty($value[$bhKey]) && $value[$bhKey] != '000000'){
  190. $item = [];
  191. $item['sczl_gdbh'] = $value['sczl_gdbh'];
  192. $item['sczl_yjno'] = $value['sczl_yjno'];
  193. $item['sczl_gxh'] = $value['sczl_gxh'];
  194. // $item['sczl_type'] = substr($value['sczl_type'],0,30);
  195. $item['sczl_type'] = $value['sczl_type'];
  196. $item['sczl_rq'] = $value['sczl_rq'];
  197. $item['sczl_jtbh'] = $value['sczl_jtbh'];
  198. $item['班组车头产量'] = $value['班组车头产量'];
  199. $item['工价系数'] = '0.0000';
  200. $item['工序难度系数'] = $gx_rate;
  201. $item['装版工时'] = $value['装版工时'];
  202. $item['保养工时'] = $value['保养工时'];
  203. $item['打样工时'] = $value['打样工时'];
  204. $item['异常停机工时'] = $value['异常停机工时'];
  205. $item['车头产量占用机时'] = $value['车头产量占用机时'];
  206. $item['日定额'] = (int)$value['日定额'];
  207. $item['千件工价'] = $value['千件工价'];
  208. $item['补产标准'] = $value['补产标准'];
  209. $item['班组换算产量'] = $afterProductionYield;
  210. $item['计时补差额工资'] = '0.00';
  211. $item['bh'] = $value[$bhKey];
  212. $item['xm'] = $value[$xmKey];
  213. $item['Rate'] = $value[$rateKey];
  214. $item['sczl_ms'] = $value['sczl_ms'];
  215. $item['核算产量'] = $accountingYield;
  216. $item['工时占比'] = $manHourRate;
  217. array_push($data,$item);
  218. }
  219. }
  220. }
  221. /**
  222. * 拆片工序数据
  223. */
  224. $query = Db::name('db_sczl')->alias('a')
  225. ->field('a.sczl_gdbh, a.sczl_yjno, a.sczl_gxh, sczl_type, a.sczl_rq, a.sczl_jtbh,
  226. a.sczl_ms, a.sczl_cl as 班组车头产量, a.sczl_fp as sczl_zcfp, a.sczl_装版工时 as 装版工时, a.sczl_保养工时 as 保养工时,
  227. a.sczl_打样工时 as 打样工时, a.sczl_异常停机工时 as 异常停机工时, a.sczl_设备运行工时 as 车头产量占用机时, a.sczl_bh1,
  228. a.sczl_rate1, b.千件工价, b.日定额, b.补产标准,a.sczl_工价系数 as 工序难度系数,a.拆片联拼系数,a.拆片条小盒系数, d.员工姓名')
  229. ->join('dic_lzde b', 'a.sczl_dedh = b.sys_bh','left')
  230. ->join('工单_工艺资料 c', 'a.sczl_gdbh = c.Gy0_gdbh AND a.sczl_yjno = c.Gy0_yjno AND a.sczl_gxh = c.Gy0_gxh','left')
  231. ->join('人事_基本资料 d', 'a.sczl_bh1 = d.员工编号','left')
  232. ->where($where)
  233. ->select();
  234. foreach ($query as $value){
  235. $value['班组车头产量'] = ($value['班组车头产量'] - $value['sczl_zcfp']) * $value['拆片联拼系数'] * $value['拆片条小盒系数'];
  236. //计件产量
  237. if ($value['工序难度系数'] <= 0 || empty($value['工序难度系数'])){
  238. $value['工序难度系数'] = '1.0000';
  239. $byThePieceYield = $value['班组车头产量'];
  240. }else{
  241. $byThePieceYield = round($value['班组车头产量'] * $value['工序难度系数']);
  242. }
  243. //补产产量/班组换算产量
  244. $afterProductionYield = ($value['装版工时'] + $value['保养工时'] + $value['打样工时']) * $value['补产标准'];
  245. //核算产量
  246. $accountingYield = $byThePieceYield + $afterProductionYield;
  247. //工时占比
  248. if ($value['日定额'] > 0){
  249. $manHourRate = number_format($accountingYield / $value['日定额'],4);
  250. }else{
  251. $manHourRate = '0.0000';
  252. }
  253. $item = [];
  254. $item['sczl_gdbh'] = $value['sczl_gdbh'];
  255. $item['sczl_yjno'] = $value['sczl_yjno'];
  256. $item['sczl_gxh'] = $value['sczl_gxh'];
  257. // $item['sczl_type'] = substr(trim($value['sczl_type']),0,30);
  258. $item['sczl_type'] = $value['sczl_type'];
  259. $item['sczl_rq'] = $value['sczl_rq'];
  260. $item['sczl_jtbh'] = $value['sczl_jtbh'];
  261. $item['班组车头产量'] = $value['班组车头产量'];
  262. $item['工价系数'] = '0.0000';
  263. $item['工序难度系数'] = $value['工序难度系数'];
  264. $item['装版工时'] = $value['装版工时'];
  265. $item['保养工时'] = $value['保养工时'];
  266. $item['打样工时'] = $value['打样工时'];
  267. $item['异常停机工时'] = $value['异常停机工时'];
  268. $item['车头产量占用机时'] = $value['车头产量占用机时'];
  269. $item['日定额'] = (int)$value['日定额'];
  270. $item['千件工价'] = $value['千件工价'];
  271. $item['补产标准'] = $value['补产标准'];
  272. $item['班组换算产量'] = $afterProductionYield;
  273. $item['计时补差额工资'] = '0.00';
  274. $item['bh'] = $value['sczl_bh1'];
  275. $item['xm'] = $value['员工姓名'];
  276. $item['Rate'] = $value['sczl_rate1'];
  277. $item['sczl_ms'] = $value['sczl_ms'];
  278. $item['核算产量'] = $accountingYield;
  279. $item['工时占比'] = floatval($manHourRate);
  280. array_push($data,$item);
  281. }
  282. // halt($data);
  283. /**
  284. * 手工检验工序数据
  285. */
  286. $shoujianfields = "a.sczl_gdbh,a.sczl_yjgx,sczl_gxmc AS sczl_type,a.sczl_rq,a.sczl_cl AS 班组车头产量,
  287. sczl_废品率系数 AS 工序难度系数,a.sczl_bh0,a.sczl_bh1,a.sczl_bh2,a.sczl_bh3,a.sczl_bh4,a.sczl_bh5,a.sczl_bh6,
  288. a.sczl_bh7,a.sczl_bh8,a.sczl_bh9,a.sczl_bh10,a.sczl_bh11,b.千件工价,b.日定额,b.补产标准,d0.员工姓名 AS name0,
  289. d1.员工姓名 AS name1,d2.员工姓名 AS name2,d3.员工姓名 AS name3,d4.员工姓名 AS name4,d5.员工姓名 AS name5,
  290. d6.员工姓名 AS name6,d7.员工姓名 AS name7,d8.员工姓名 AS name8,d9.员工姓名 AS name9,d10.员工姓名 AS name10,
  291. 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,
  292. 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,
  293. 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";
  294. $query = Db::name('db_手工检验')->alias('a')->field($shoujianfields);
  295. //链接dic_lzde表
  296. $query->join('dic_lzde b','a.sczl_dedh = b.sys_bh','LEFT');
  297. //链接人事基本资料表
  298. for ($i=0;$i<=12;$i++){
  299. $field = 'a.sczl_bh'.$i;
  300. $alias = 'd'.$i;
  301. $query->join("人事_基本资料 $alias", "$field = {$alias}.员工编号 AND {$field} IS NOT NULL", 'LEFT');
  302. }
  303. $query->where($where);
  304. $list = $query->select();
  305. foreach ($list as $key=>$value){
  306. for ($i=0;$i<=12;$i++){
  307. if (!empty($value['sczl_bh'.$i])){
  308. $value['sczl_yjno'] = (int)substr($value['sczl_yjgx'],0,2);
  309. $value['sczl_gxh'] = (int)substr($value['sczl_yjgx'],3,2);
  310. //车头产量
  311. $value['班组车头产量'] = $value['sczl_cl'.$i]*$value['sczl_fp'.$i];
  312. //计件产量
  313. if ($value['工序难度系数'] <= 0 || empty($value['工序难度系数'])){
  314. $value['工序难度系数'] = '1.0000';
  315. $value['计件产量'] = $value['班组车头产量'];
  316. }else{
  317. $value['计件产量'] = round($value['班组车头产量'] * $value['工序难度系数']);
  318. }
  319. //核算产量
  320. $value['核算产量'] = $value['计件产量'];
  321. //工时占比
  322. if ($value['日定额'] > 0){
  323. $value['工时占比'] = round($value['计件产量']/$value['日定额'],4);
  324. }else{
  325. $value['工时占比'] = '0.0000';
  326. }
  327. $item = [];
  328. $item['sczl_gdbh'] = $value['sczl_gdbh'];
  329. $item['sczl_yjno'] = $value['sczl_yjno'];
  330. $item['sczl_gxh'] = $value['sczl_gxh'];
  331. // $item['sczl_type'] = substr($value['sczl_type'],0,30);
  332. $item['sczl_type'] = $value['sczl_type'];
  333. $item['sczl_rq'] = $value['sczl_rq'];
  334. $item['sczl_jtbh'] = '';
  335. $item['班组车头产量'] = $value['班组车头产量'];
  336. $item['工价系数'] = '0.0000';
  337. $item['工序难度系数'] = $value['工序难度系数'];
  338. $item['装版工时'] = '0.00';
  339. $item['保养工时'] = '0.00';
  340. $item['打样工时'] = '0.00';
  341. $item['异常停机工时'] = '0.00';
  342. $item['车头产量占用机时'] = '0.00';
  343. $item['日定额'] = (int)$value['日定额'];
  344. $item['千件工价'] = $value['千件工价'];
  345. $item['补产标准'] = $value['补产标准'];
  346. $item['班组换算产量'] = '0';
  347. $item['计时补差额工资'] = '0.00';
  348. $item['bh'] = $value['sczl_bh'.$i];
  349. $item['xm'] = $value['name'.$i];
  350. $item['Rate'] = '1.0000';
  351. $item['sczl_ms'] = '0.00';
  352. $item['核算产量'] = $value['核算产量'];
  353. $item['工时占比'] = floatval($value['工时占比']);
  354. array_push($data,$item);
  355. }
  356. }
  357. }
  358. // halt($data);
  359. /**
  360. * 包装计件工序数据
  361. */
  362. $result = Db::name('db_包装计件')->alias('a')
  363. ->field('a.sczl_gdbh1, a.sczl_gdbh2, a.sczl_gdbh3, a.sczl_gdbh4, a.sczl_gdbh5, a.sczl_gdbh6,
  364. a.sczl_yjGx1, a.sczl_yjGx2, a.sczl_yjGx3, a.sczl_yjGx4, a.sczl_yjGx5, a.sczl_yjGx6,
  365. 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,
  366. a.sczl_cl1, a.sczl_cl2, a.sczl_cl3, a.sczl_cl4, a.sczl_cl5, a.sczl_cl6,
  367. a.sczl_返工产量1, a.sczl_返工产量2, a.sczl_返工产量3, a.sczl_返工产量4, a.sczl_返工产量5, a.sczl_返工产量6,
  368. a.sczl_Jtbh1,a.sczl_Jtbh2,a.sczl_Jtbh3,a.sczl_Jtbh4,a.sczl_Jtbh5,a.sczl_Jtbh6,
  369. a.sczl_PgCl1,a.sczl_PgCl2,a.sczl_PgCl3,a.sczl_PgCl4,a.sczl_PgCl5,a.sczl_PgCl6,
  370. a.sczl_type1,a.sczl_type2,sczl_type3,a.sczl_type4,a.sczl_type5,sczl_type6,
  371. a.sczl_计产系数1,a.sczl_计产系数2,a.sczl_计产系数3,a.sczl_计产系数4,a.sczl_计产系数5,a.sczl_计产系数6,
  372. c1.工价系数 as 工序难度系数1,c2.工价系数 as 工序难度系数2,c3.工价系数 as 工序难度系数3,c4.工价系数 as 工序难度系数4,c5.工价系数 as 工序难度系数5,c6.工价系数 as 工序难度系数6,
  373. b1.千件工价 as 千件工价1, b2.千件工价 as 千件工价2, b3.千件工价 as 千件工价3, b4.千件工价 as 千件工价4, b5.千件工价 as 千件工价5, b6.千件工价 as 千件工价6,
  374. b1.日定额 as 日定额1, b2.日定额 as 日定额2, b3.日定额 as 日定额3, b4.日定额 as 日定额4, b5.日定额 as 日定额5, b6.日定额 as 日定额6,
  375. b1.补产标准 as 补产标准1, b2.补产标准 as 补产标准2, b3.补产标准 as 补产标准3, b4.补产标准 as 补产标准4, b5.补产标准 as 补产标准5, b6.补产标准 as 补产标准6,
  376. a.sczl_rq,a.sczl_bh,rtrim(d.员工姓名) as xm,
  377. e1.成品名称 as cpmc1,e2.成品名称 as cpmc2,e3.成品名称 as cpmc3,e4.成品名称 as cpmc4,e5.成品名称 as cpmc5,e6.成品名称 as cpmc6')
  378. ->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')
  379. ->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')
  380. ->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')
  381. ->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')
  382. ->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')
  383. ->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')
  384. ->join('dic_lzde b1', 'a.sczl_dedh1 = b1.sys_bh', 'LEFT')
  385. ->join('dic_lzde b2', 'a.sczl_dedh2 = b2.sys_bh', 'LEFT')
  386. ->join('dic_lzde b3', 'a.sczl_dedh3 = b3.sys_bh', 'LEFT')
  387. ->join('dic_lzde b4', 'a.sczl_dedh4 = b4.sys_bh', 'LEFT')
  388. ->join('dic_lzde b5', 'a.sczl_dedh5 = b5.sys_bh', 'LEFT')
  389. ->join('dic_lzde b6', 'a.sczl_dedh6 = b6.sys_bh', 'LEFT')
  390. ->join('人事_基本资料 d', 'a.sczl_bh = d.员工编号', 'LEFT')
  391. ->join('工单_基本资料 e1','a.sczl_gdbh1 = e1.Gd_gdbh AND a.sczl_gdbh1 IS NOT NULL','LEFT')
  392. ->join('工单_基本资料 e2','a.sczl_gdbh2 = e2.Gd_gdbh AND a.sczl_gdbh2 IS NOT NULL','LEFT')
  393. ->join('工单_基本资料 e3','a.sczl_gdbh3 = e3.Gd_gdbh AND a.sczl_gdbh3 IS NOT NULL','LEFT')
  394. ->join('工单_基本资料 e4','a.sczl_gdbh4 = e4.Gd_gdbh AND a.sczl_gdbh4 IS NOT NULL','LEFT')
  395. ->join('工单_基本资料 e5','a.sczl_gdbh5 = e5.Gd_gdbh AND a.sczl_gdbh5 IS NOT NULL','LEFT')
  396. ->join('工单_基本资料 e6','a.sczl_gdbh6 = e6.Gd_gdbh AND a.sczl_gdbh6 IS NOT NULL','LEFT')
  397. ->where($where)
  398. ->group('a.UniqId')
  399. ->select();
  400. // halt($result);
  401. foreach ($result as $value){
  402. for ($i=1;$i<7;$i++){
  403. $item = [];
  404. $gdbhKey = 'sczl_gdbh'.$i;
  405. $yjgxKey = 'sczl_yjGx'.$i;
  406. $jtbhKey = 'sczl_Jtbh'.$i;
  407. $gxmcKey = 'gxmc'.$i;
  408. $clKey = 'sczl_cl'.$i;
  409. $reworkKey = 'sczl_返工产量'.$i;
  410. $gxKey = '工序难度系数'.$i;
  411. $thousandKey = '千件工价'.$i;
  412. $dailyKey = '日定额'.$i;
  413. $afterKey = '补产标准'.$i;
  414. $pgclKey = 'sczl_PgCl'.$i;
  415. $jcxsKey = 'sczl_计产系数'.$i;
  416. $cpmcKey = 'cpmc'.$i;
  417. $typekey = 'sczl_type'.$i;
  418. if (!empty($value[$gdbhKey])){
  419. $item['sczl_gdbh'] = $value[$gdbhKey];
  420. $item['sczl_yjno'] = ltrim(substr($value[$yjgxKey],0,2), '0');
  421. $item['sczl_gxh'] = abs((int)substr($value[$yjgxKey],-2));
  422. // $item['sczl_type'] = substr($value[$gxmcKey],0,30);
  423. $item['sczl_type'] = $value[$gxmcKey];
  424. if (!empty($value[$reworkKey]) && $value[$reworkKey] > 0){
  425. $item['sczl_type'] = '返工('.$item['sczl_type'].')';
  426. }
  427. $item['sczl_rq'] = $value['sczl_rq'];
  428. $item['sczl_jtbh'] = $value[$jtbhKey];
  429. if (!empty($value[$reworkKey]) && $value[$reworkKey] > 0){
  430. $cl = $value[$reworkKey];
  431. }else{
  432. $cl = $value[$clKey];
  433. }
  434. if ($item['sczl_type'] === '包装'){
  435. $item['班组车头产量'] = $cl * $value[$pgclKey] / (int)$value[$typekey];
  436. }else{
  437. $item['班组车头产量'] = $cl;
  438. }
  439. $item['工价系数'] = '0.0000';
  440. $item['工序难度系数'] = $value[$jcxsKey];
  441. if ($value[$jcxsKey] <= 0){
  442. $item['工序难度系数'] = '1.0000';
  443. }
  444. $item['装版工时'] = '0.00';
  445. $item['保养工时'] = '0.00';
  446. $item['打样工时'] = '0.00';
  447. $item['异常停机工时'] = '0.00';
  448. $item['车头产量占用机时'] = '0.00';
  449. $item['日定额'] = $value[$dailyKey];
  450. $item['千件工价'] = $value[$thousandKey];
  451. $item['补产标准'] = $value[$afterKey];
  452. $item['班组换算产量'] = '0.00';
  453. $item['计时补差额工资'] = '0.00';
  454. $item['bh'] = $value['sczl_bh'];
  455. $item['xm'] = $value['xm'];
  456. $item['Rate'] = 1.000;
  457. $item['sczl_ms'] = '0.00';
  458. $item['核算产量'] = $item['班组车头产量'] * $item['工序难度系数'];
  459. //工时占比
  460. if ($item['日定额'] > 0){
  461. $manHourRate = number_format($item['核算产量'] / $item['日定额'],4);
  462. }else{
  463. $manHourRate = '0.0000';
  464. }
  465. $item['工时占比'] = floatval($manHourRate);
  466. array_push($data,$item);
  467. }
  468. }
  469. }
  470. // halt($data);
  471. // 用于存储bh对应的工时占比总和
  472. $bhTotals = [];
  473. // 遍历原始数据
  474. foreach ($data as $row) {
  475. $bh = substr($row['sczl_rq'],0,10) . '-' .$row['bh'];
  476. // 初始化bh对应的工时占比总和为0
  477. if (!isset($bhTotals[$bh])) {
  478. $bhTotals[$bh] = 0;
  479. }
  480. // 将工时占比相加
  481. $bhTotals[$bh] += floatval($row['工时占比']);
  482. }
  483. //用usort函数对$data数组按照sczl_rq的日期部分进行升序排序
  484. usort($data, function ($a, $b) {
  485. return strtotime(substr($a['sczl_rq'], 0, 10)) - strtotime(substr($b['sczl_rq'], 0, 10));
  486. });
  487. $days = [];
  488. foreach ($data as $key=>$item){
  489. //统计每月出勤天数
  490. $day_bh = $item['bh'];
  491. if (!isset($days[$day_bh])){
  492. $days[$day_bh] = [];
  493. array_push($days[$day_bh],$item['sczl_rq']);
  494. }else{
  495. if (in_array($item['sczl_rq'],$days[$day_bh]) == false){
  496. array_push($days[$day_bh],$item['sczl_rq']);
  497. }
  498. }
  499. $bh = substr($item['sczl_rq'],0,10) . '-' .$item['bh'];
  500. //达标定额
  501. if ($item['工时占比'] > 0){
  502. $standardQuota = floatval($item['工时占比'] / $bhTotals[$bh] * $item['日定额']);
  503. $data[$key]['达标定额'] = number_format($standardQuota,2,'.', '');
  504. }else{
  505. $data[$key]['达标定额'] = number_format($item['班组车头产量'],2,'.', '');
  506. }
  507. $date = substr($item['sczl_rq'],0,10);
  508. if (in_array($date,$vacationOneArr) || in_array($date,$vacationTwoArr)){
  509. //计件工资
  510. // $pieceWorkWage = $data[$key]['达标定额']/1000*$item['千件工价']*$item['Rate']*3;
  511. $pieceWorkWage = 0;
  512. //加班工资
  513. $overTimePay = $item['核算产量'] / 1000 *$item['千件工价'] * $item['Rate'] *3;
  514. //法定节假日,去除这天的考勤天数
  515. $days[$day_bh] = array_filter($days[$day_bh], function($value) use ($item) {
  516. return $value !== $item['sczl_rq'];
  517. });
  518. }else{
  519. //如果出勤天数小于法定天数,按正常计算
  520. if (count($days[$day_bh]) <= $params['days']){
  521. $pieceWorkWage = $data[$key]['达标定额']/1000*$item['千件工价']*$item['Rate'];
  522. }else{ //如果出勤天数大于法定天数,达标定额为 0,计件工资为0,超出的部分按加班工资算
  523. $data[$key]['达标定额'] = '0.00';
  524. $pieceWorkWage = '0.00';
  525. }
  526. $overTimePay = ($item['核算产量'] - $data[$key]['达标定额']) / 1000 *$item['千件工价'] * $item['Rate'] *1.5;
  527. }
  528. $data[$key]['个人计件工资'] = number_format($pieceWorkWage,2,'.', '');
  529. $data[$key]['个人加班工资'] = number_format($overTimePay,2,'.', '');
  530. $data[$key]['UniqID'] = $UniqId++;
  531. $data[$key]['sys_ny'] = $params['date'];
  532. $data[$key]['sys_rq'] = date('Y-m-d H:i:s');
  533. $data[$key]['sys_id'] = $params['sys_id'];
  534. $data[$key]['法定天数'] = $params['days'];
  535. $data[$key]['sczl_type'] = trim($item['sczl_type']);
  536. }
  537. // 检查任务是否已经存在于队列中,如果不存在则推送任务到队列
  538. if (!$redis->has($taskIdentifier)) {
  539. $job = new InsertDataJob($data); // 创建任务实例
  540. // 推送任务到队列
  541. Queue::push($job,'','default'); // 推送任务到队列
  542. // 设置任务的标识符到缓存中,并设置有效期,有效期为队列执行时间的两倍
  543. $redis->set($taskIdentifier, true);
  544. $this->success('数据正在处理中,请等待...');
  545. }
  546. }
  547. }