StaffSalary.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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. // halt($data);
  199. // 用于存储bh对应的工时占比总和
  200. $bhTotals = [];
  201. // 遍历原始数据
  202. foreach ($data as $row) {
  203. $bh = substr($row['sczl_rq'],0,10) . '-' .$row['bh'];
  204. // 初始化bh对应的工时占比总和为0
  205. if (!isset($bhTotals[$bh])) {
  206. $bhTotals[$bh] = 0;
  207. }
  208. // 将工时占比相加
  209. $bhTotals[$bh] += floatval($row['工时占比']);
  210. }
  211. // halt($bhTotals);
  212. foreach ($data as $key=>$item){
  213. $bh = substr($item['sczl_rq'],0,10) . '-' .$item['bh'];
  214. //达标定额
  215. $standardQuota = floatval($item['工时占比'] / $bhTotals[$bh] * $item['日定额']);
  216. $data[$key]['达标定额'] = number_format($standardQuota,2,'.', '');
  217. $date = substr($item['sczl_rq'],0,10);
  218. if (in_array($date,$vacationOneArr) || in_array($date,$vacationTwoArr)){
  219. //计件工资
  220. $pieceWorkWage = $standardQuota/1000*$item['千件工价']*$item['Rate']*3;
  221. //加班工资
  222. $overTimePay = ($item['核算产量'] - $standardQuota) / 1000 *$item['千件工价'] * $item['Rate'] *1.5*3;
  223. }else{
  224. $pieceWorkWage = $standardQuota/1000*$item['千件工价']*$item['Rate'];
  225. $overTimePay = ($item['核算产量'] - $standardQuota) / 1000 *$item['千件工价'] * $item['Rate'] *1.5;
  226. }
  227. $data[$key]['个人计件工资'] = number_format($pieceWorkWage,2,'.', '');
  228. $data[$key]['个人加班工资'] = number_format($overTimePay,2,'.', '');
  229. $data[$key]['UniqID'] = $UniqId++;
  230. $data[$key]['sys_ny'] = $params['date'];
  231. unset($data[$key]['核算产量']);
  232. }
  233. halt($data);
  234. $res = \db('绩效工资汇总_temp')->insertAll($data);
  235. }
  236. }