StaffSalary.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\controller\Api;
  4. use \think\Request;
  5. use think\Db;
  6. /**
  7. * 员工计件工资核算
  8. */
  9. class StaffSalary extends Api
  10. {
  11. protected $noNeedLogin = ['*'];
  12. protected $noNeedRight = ['*'];
  13. /**
  14. * 首页
  15. *
  16. */
  17. public function index()
  18. {
  19. $this->success('请求成功');
  20. }
  21. /**
  22. * 计算员工计件工资
  23. * @ApiMethod POST
  24. * @param string date 考勤年月
  25. * @param string start_date 开始日期
  26. * @param string end_date 结束日期
  27. * @param string vacation_one_start 法定假日1 开始时间
  28. * @param string vacation_one_end 法定假日1 结束时间
  29. * @param string vacation_two_start 法定假日2 开始时间
  30. * @param string vacation_two_end 法定假日2 结束时间
  31. */
  32. public function staffSalaryCount(){
  33. if (Request::instance()->isPost() == false){
  34. $this->error('非法请求');
  35. }
  36. $params = Request::instance()->param();
  37. if (!isset($params['start_date']) || !isset($params['end_date']) || empty($params['start_date']) || empty($params['end_date']) || !isset($params['date']) || empty($params['date']))
  38. {
  39. $this->error('参数错误');
  40. }
  41. $vacationOneArr = [];
  42. if (!empty($params['vacation_one_start']) && !empty($params['vacation_one_end'])){
  43. $vacationOneStart = strtotime($params['vacation_one_start']);
  44. $vacationOneEnd = strtotime($params['vacation_one_end']);
  45. for ($i=$vacationOneStart; $i<=$vacationOneEnd; $i+=86400)
  46. {
  47. array_push($vacationOneArr,date("Y-m-d", $i));
  48. }
  49. }
  50. $vacationTwoArr = [];
  51. if (!empty($params['vacation_two_start']) && !empty($params['vacation_two_end'])){
  52. $vacationTwoStart = strtotime($params['vacation_two_start']);
  53. $vacationTwoEnd = strtotime($params['vacation_two_end']);
  54. for ($i=$vacationTwoStart; $i<=$vacationTwoEnd; $i+=86400)
  55. {
  56. array_push($vacationTwoArr,date("Y-m-d", $i));
  57. }
  58. }
  59. $startDate = $params['start_date'];
  60. $endDate = $params['end_date'];
  61. $where = [];
  62. $where['a.sczl_rq'] = ['between',[$startDate,$endDate]];
  63. $fields = "a.sczl_gdbh,a.sczl_yjno,a.sczl_gxh,a.sczl_gxmc as sczl_type,a.sczl_rq,a.sczl_jtbh,a.sczl_ms,a.sczl_cl as 班组车头产量,a.sczl_zcfp,
  64. a.sczl_装版工时 as 装版工时,a.sczl_保养工时 as 保养工时,a.sczl_打样工时 as 打样工时,a.sczl_异常停机工时 as 异常停机工时,a.sczl_设备运行工时 as 车头产量占用机时,
  65. 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,
  66. 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,
  67. b.千件工价,b.日定额,b.补产标准,c.工价系数 as 工序难度系数
  68. ,d1.员工姓名 as name1,d2.员工姓名 as name2,d3.员工姓名 as name3,d4.员工姓名 as name4,d5.员工姓名 as name5,d6.员工姓名 as name6,d7.员工姓名 as name7,d8.员工姓名 as name8
  69. ,d9.员工姓名 as name9,d10.员工姓名 as name10";
  70. // $query = \db('设备_产量计酬')->alias('a')->field($fields);
  71. // // 连接 dic_lzde 表
  72. // $query->join('dic_lzde b', 'a.sczl_dedh = b.sys_bh', 'LEFT');
  73. // // 连接 工单_工艺资料 表
  74. // $query->join('工单_工艺资料 c', 'a.sczl_gdbh = c.Gy0_gdbh AND a.sczl_yjno = c.Gy0_yjno AND a.sczl_gxh = c.Gy0_gxh', 'LEFT');
  75. // // 循环连接 人事_基本资料 表(仅当 sczl_bh 不为空时才连接)
  76. // for ($i = 1; $i <= 10; $i++) {
  77. // $field = 'a.sczl_bh' . $i;
  78. // $alias = 'd' . $i;
  79. // $query->join("人事_基本资料 $alias", "$field = {$alias}.员工编号 AND {$field} IS NOT NULL", 'LEFT');
  80. // }
  81. // $query->where($where);
  82. // $list = $query->select();
  83. $UniqId = \db('绩效工资汇总_temp')->field('UniqID')->order('UniqID desc')->find();
  84. if (empty($UniqId)){
  85. $UniqId = 1;
  86. }else{
  87. $UniqId = $UniqId['UniqID'];
  88. }
  89. $data = [];
  90. //设备_产量计酬数据
  91. // foreach ($list as $value){
  92. // $value['班组车头产量'] = $value['班组车头产量'] - $value['sczl_zcfp'];
  93. // //计件产量
  94. // if ($value['工序难度系数'] <= 0 || empty($value['工序难度系数'])){
  95. // $value['工序难度系数'] = '1.0000';
  96. // $byThePieceYield = $value['班组车头产量'];
  97. // }else{
  98. // $byThePieceYield = round($value['班组车头产量'] * $value['工序难度系数']);
  99. // }
  100. // //补产产量/班组换算产量
  101. // $afterProductionYield = ($value['装版工时'] + $value['保养工时'] + $value['打样工时']) * $value['补产标准'];
  102. // //核算产量
  103. // $accountingYield = $byThePieceYield + $afterProductionYield;
  104. // //工时占比
  105. // $manHourRate = number_format($accountingYield / $value['日定额'],4);
  106. // for ($i=1; $i<11; $i++){
  107. // $bhKey = 'sczl_bh'.$i;
  108. // $xmKey = 'name'.$i;
  109. // $rateKey = 'sczl_rate'.$i;
  110. // if (!empty($value[$bhKey]) && $value[$bhKey] != '000000'){
  111. // $item = [];
  112. // $item['sczl_gdbh'] = $value['sczl_gdbh'];
  113. // $item['sczl_yjno'] = $value['sczl_yjno'];
  114. // $item['sczl_gxh'] = $value['sczl_gxh'];
  115. // $item['sczl_type'] = substr($value['sczl_type'],0,30);
  116. // $item['sczl_rq'] = $value['sczl_rq'];
  117. // $item['sczl_jtbh'] = $value['sczl_jtbh'];
  118. // $item['班组车头产量'] = $value['班组车头产量'];
  119. // $item['工价系数'] = '0.0000';
  120. // $item['工序难度系数'] = $value['工序难度系数'];
  121. // $item['装版工时'] = $value['装版工时'];
  122. // $item['保养工时'] = $value['保养工时'];
  123. // $item['打样工时'] = $value['打样工时'];
  124. // $item['异常停机工时'] = $value['异常停机工时'];
  125. // $item['车头产量占用机时'] = $value['车头产量占用机时'];
  126. // $item['日定额'] = (int)$value['日定额'];
  127. // $item['千件工价'] = $value['千件工价'];
  128. // $item['补产标准'] = $value['补产标准'];
  129. // $item['班组换算产量'] = $afterProductionYield;
  130. // $item['计时补差额工资'] = '0.00';
  131. // $item['bh'] = $value[$bhKey];
  132. // $item['xm'] = $value[$xmKey];
  133. // $item['Rate'] = $value[$rateKey];
  134. // $item['sczl_ms'] = $value['sczl_ms'];
  135. // $item['核算产量'] = $accountingYield;
  136. // $item['工时占比'] = floatval($manHourRate);
  137. // array_push($data,$item);
  138. // }
  139. // }
  140. // }
  141. //拆片工序数据
  142. $query = Db::table('db_sczl')->alias('a')
  143. ->field('a.sczl_gdbh, a.sczl_yjno, a.sczl_gxh, sczl_type, a.sczl_rq, a.sczl_jtbh,
  144. a.sczl_ms, a.sczl_cl as 班组车头产量, a.sczl_fp as sczl_zcfp, a.sczl_装版工时 as 装版工时, a.sczl_保养工时 as 保养工时,
  145. a.sczl_打样工时 as 打样工时, a.sczl_异常停机工时 as 异常停机工时, a.sczl_设备运行工时 as 车头产量占用机时, a.sczl_bh1,
  146. a.sczl_rate1, b.千件工价, b.日定额, b.补产标准, c.工价系数 as 工序难度系数, d.员工姓名')
  147. ->join('dic_lzde b', 'a.sczl_dedh = b.sys_bh','left')
  148. ->join('工单_工艺资料 c', 'a.sczl_gdbh = c.Gy0_gdbh AND a.sczl_yjno = c.Gy0_yjno AND a.sczl_gxh = c.Gy0_gxh','left')
  149. ->join('人事_基本资料 d', 'a.sczl_bh1 = d.员工编号','left')
  150. ->where($where)
  151. // ->fetchSql(true)
  152. ->select();
  153. // halt($query);
  154. foreach ($query as $value){
  155. $value['班组车头产量'] = $value['班组车头产量'] - $value['sczl_zcfp'];
  156. //计件产量
  157. if ($value['工序难度系数'] <= 0 || empty($value['工序难度系数'])){
  158. $value['工序难度系数'] = '1.0000';
  159. $byThePieceYield = $value['班组车头产量'];
  160. }else{
  161. $byThePieceYield = round($value['班组车头产量'] * $value['工序难度系数']);
  162. }
  163. //补产产量/班组换算产量
  164. $afterProductionYield = ($value['装版工时'] + $value['保养工时'] + $value['打样工时']) * $value['补产标准'];
  165. //核算产量
  166. $accountingYield = $byThePieceYield + $afterProductionYield;
  167. //工时占比
  168. $manHourRate = number_format($accountingYield / $value['日定额'],4);
  169. $item = [];
  170. $item['sczl_gdbh'] = $value['sczl_gdbh'];
  171. $item['sczl_yjno'] = $value['sczl_yjno'];
  172. $item['sczl_gxh'] = $value['sczl_gxh'];
  173. $item['sczl_type'] = substr($value['sczl_type'],0,30);
  174. $item['sczl_rq'] = $value['sczl_rq'];
  175. $item['sczl_jtbh'] = $value['sczl_jtbh'];
  176. $item['班组车头产量'] = $value['班组车头产量'];
  177. $item['工价系数'] = '0.0000';
  178. $item['工序难度系数'] = $value['工序难度系数'];
  179. $item['装版工时'] = $value['装版工时'];
  180. $item['保养工时'] = $value['保养工时'];
  181. $item['打样工时'] = $value['打样工时'];
  182. $item['异常停机工时'] = $value['异常停机工时'];
  183. $item['车头产量占用机时'] = $value['车头产量占用机时'];
  184. $item['日定额'] = (int)$value['日定额'];
  185. $item['千件工价'] = $value['千件工价'];
  186. $item['补产标准'] = $value['补产标准'];
  187. $item['班组换算产量'] = $afterProductionYield;
  188. $item['计时补差额工资'] = '0.00';
  189. $item['bh'] = $value['sczl_bh1'];
  190. $item['xm'] = $value['员工姓名'];
  191. $item['Rate'] = $value['sczl_rate1'];
  192. $item['sczl_ms'] = $value['sczl_ms'];
  193. $item['核算产量'] = $accountingYield;
  194. $item['工时占比'] = floatval($manHourRate);
  195. // array_push($data,$item);
  196. }
  197. //手工检验工序数据
  198. $shoujianfields = "a.sczl_gdbh,a.sczl_yjgx,sczl_gxmc AS sczl_type,a.sczl_rq,a.sczl_cl AS 班组车头产量,
  199. sczl_废品率系数 AS 工序难度系数,a.sczl_bh0,a.sczl_bh1,a.sczl_bh2,a.sczl_bh3,a.sczl_bh4,a.sczl_bh5,a.sczl_bh6,
  200. a.sczl_bh7,a.sczl_bh8,a.sczl_bh9,a.sczl_bh10,a.sczl_bh11,b.千件工价,b.日定额,b.补产标准,d0.员工姓名 AS name0,
  201. d1.员工姓名 AS name1,d2.员工姓名 AS name2,d3.员工姓名 AS name3,d4.员工姓名 AS name4,d5.员工姓名 AS name5,
  202. d6.员工姓名 AS name6,d7.员工姓名 AS name7,d8.员工姓名 AS name8,d9.员工姓名 AS name9,d10.员工姓名 AS name10,
  203. 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,
  204. 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,
  205. 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";
  206. $query = \db('db_手工检验')->alias('a')->field($shoujianfields);
  207. //链接dic_lzde表
  208. $query->join('dic_lzde b','a.sczl_dedh = b.sys_bh','LEFT');
  209. //链接人事基本资料表
  210. for ($i=0;$i<=12;$i++){
  211. $field = 'a.sczl_bh'.$i;
  212. $alias = 'd'.$i;
  213. $query->join("人事_基本资料 $alias", "$field = {$alias}.员工编号 AND {$field} IS NOT NULL", 'LEFT');
  214. }
  215. $query->where($where);
  216. $list = $query->select();
  217. foreach ($list as $key=>$value){
  218. for ($i=0;$i<=12;$i++){
  219. if (!empty($value['sczl_bh'.$i])){
  220. $value['sczl_yjno'] = (int)substr($value['sczl_yjgx'],0,2);
  221. $value['sczl_gxh'] = (int)substr($value['sczl_yjgx'],3,2);
  222. //车头产量
  223. $value['班组车头产量'] = $value['sczl_cl'.$i]*$value['sczl_fp'.$i];
  224. //计件产量
  225. if ($value['工序难度系数'] <= 0 || empty($value['工序难度系数'])){
  226. $value['工序难度系数'] = '1.0000';
  227. $value['计件产量'] = $value['班组车头产量'];
  228. }else{
  229. $value['计件产量'] = round($value['班组车头产量'] * $value['工序难度系数']);
  230. }
  231. //核算产量
  232. $value['核算产量'] = $value['计件产量'];
  233. //工时占比
  234. $value['工时占比'] = round($value['计件产量']/$value['日定额'],4);
  235. $item = [];
  236. $item['sczl_gdbh'] = $value['sczl_gdbh'];
  237. $item['sczl_yjno'] = $value['sczl_yjno'];
  238. $item['sczl_gxh'] = $value['sczl_gxh'];
  239. $item['sczl_type'] = substr($value['sczl_type'],0,30);
  240. $item['sczl_rq'] = $value['sczl_rq'];
  241. $item['sczl_jtbh'] = '';
  242. $item['班组车头产量'] = $value['班组车头产量'];
  243. $item['工价系数'] = '0.0000';
  244. $item['工序难度系数'] = $value['工序难度系数'];
  245. $item['装版工时'] = '0.00';
  246. $item['保养工时'] = '0.00';
  247. $item['打样工时'] = '0.00';
  248. $item['异常停机工时'] = '0.00';
  249. $item['车头产量占用机时'] = '0.00';
  250. $item['日定额'] = (int)$value['日定额'];
  251. $item['千件工价'] = $value['千件工价'];
  252. $item['补产标准'] = $value['补产标准'];
  253. $item['班组换算产量'] = '0';
  254. $item['计时补差额工资'] = '0.00';
  255. $item['bh'] = $value['sczl_bh'.$i];
  256. $item['xm'] = $value['name'.$i];
  257. $item['Rate'] = '1.0000';
  258. $item['sczl_ms'] = '0.00';
  259. $item['核算产量'] = $value['核算产量'];
  260. $item['工时占比'] = floatval($value['工时占比']);
  261. array_push($data,$item);
  262. }
  263. }
  264. }
  265. // halt($data);
  266. // 用于存储bh对应的工时占比总和
  267. $bhTotals = [];
  268. // 遍历原始数据
  269. foreach ($data as $row) {
  270. $bh = substr($row['sczl_rq'],0,10) . '-' .$row['bh'];
  271. // 初始化bh对应的工时占比总和为0
  272. if (!isset($bhTotals[$bh])) {
  273. $bhTotals[$bh] = 0;
  274. }
  275. // 将工时占比相加
  276. $bhTotals[$bh] += floatval($row['工时占比']);
  277. }
  278. // halt($bhTotals);
  279. foreach ($data as $key=>$item){
  280. $bh = substr($item['sczl_rq'],0,10) . '-' .$item['bh'];
  281. //达标定额
  282. $standardQuota = floatval($item['工时占比'] / $bhTotals[$bh] * $item['日定额']);
  283. $data[$key]['达标定额'] = number_format($standardQuota,2,'.', '');
  284. $date = substr($item['sczl_rq'],0,10);
  285. if (in_array($date,$vacationOneArr) || in_array($date,$vacationTwoArr)){
  286. //计件工资
  287. $pieceWorkWage = $standardQuota/1000*$item['千件工价']*$item['Rate']*3;
  288. //加班工资
  289. $overTimePay = ($item['核算产量'] - $standardQuota) / 1000 *$item['千件工价'] * $item['Rate'] *1.5*3;
  290. }else{
  291. $pieceWorkWage = $standardQuota/1000*$item['千件工价']*$item['Rate'];
  292. $overTimePay = ($item['核算产量'] - $standardQuota) / 1000 *$item['千件工价'] * $item['Rate'] *1.5;
  293. }
  294. $data[$key]['个人计件工资'] = number_format($pieceWorkWage,2,'.', '');
  295. $data[$key]['个人加班工资'] = number_format($overTimePay,2,'.', '');
  296. $data[$key]['UniqID'] = $UniqId++;
  297. $data[$key]['sys_ny'] = $params['date'];
  298. unset($data[$key]['核算产量']);
  299. }
  300. // halt($data);
  301. // $res = \db('绩效工资汇总_temp')->insertAll($data);
  302. }
  303. }