| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612 |
- <?php
- namespace app\service;
- use think\Db;
- use think\Exception;
- use think\Log;
- /**
- * 工资计算服务类
- */
- class SalaryCalculationService
- {
- /**
- * 执行工资计算主方法
- * @param array $params 计算参数
- * @return array 计算结果
- */
- public function calculateSalary(array $params): array
- {
- $startDate = $params['start_date'];
- $endDate = $params['end_date'];
- $attendanceMonth = $params['date'];
- // 确保开始日期和结束日期在考勤年月的范围内
- $startDateInRange = date('Ym', strtotime($startDate)) === $attendanceMonth;
- $endDateInRange = date('Ym', strtotime($endDate)) === $attendanceMonth;
- if (!$startDateInRange || !$endDateInRange) {
- $this->error('日期参数错误');
- }
- $vacationOneArr = [];
- if (!empty($params['vacation_one_start']) && !empty($params['vacation_one_end'])) {
- $vacationOneStart = strtotime($params['vacation_one_start']);
- $vacationOneEnd = strtotime($params['vacation_one_end']);
- for ($i = $vacationOneStart; $i <= $vacationOneEnd; $i += 86400) {
- array_push($vacationOneArr, date("Y-m-d", $i));
- }
- }
- $vacationTwoArr = [];
- if (!empty($params['vacation_two_start']) && !empty($params['vacation_two_end'])) {
- $vacationTwoStart = strtotime($params['vacation_two_start']);
- $vacationTwoEnd = strtotime($params['vacation_two_end']);
- for ($i = $vacationTwoStart; $i <= $vacationTwoEnd; $i += 86400) {
- array_push($vacationTwoArr, date("Y-m-d", $i));
- }
- }
- //法定天数
- $clocking_in_day = \db('人事_考勤资料')->where('kqzl_ny', $params['date'])->field('法定天数')->order('UniqId desc')->find();
- if (!empty($clocking_in_day)){
- $params['days'] = (int)$clocking_in_day['法定天数'];
- }
- //将起止日期内数据删除
- $delRes = \db('绩效工资汇总')->where('sczl_rq', 'between', [$startDate, $endDate])->delete();
- //设备产量计酬报工数据查询
- $where = [];
- $where['a.sczl_rq'] = ['between', [$startDate, $endDate]];
- //查询印刷印后车间的机台,添加搜索条件
- $sist = ['胶印车间', '凹丝印车间', '印后车间', '检验车间'];
- $jtbhs = db('设备_基本资料')
- ->where('sys_sbID', '<>', '')
- ->where('使用部门', 'in', $sist)
- ->column('设备编号');
- $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,
- a.sczl_装版工时 as 装版工时,a.sczl_保养工时 as 保养工时,a.sczl_打样工时 as 打样工时,a.sczl_异常工时1 as 异常停机工时,a.sczl_设备运行工时 as 车头产量占用机时,
- 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,
- 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,
- a.sczl_废品率系数,a.UniqId,
- b.千件工价,b.日定额,b.补产标准,c.工价系数 as 工序难度系数,c.版距,c.印刷方式
- ,d1.员工姓名 as name1,d2.员工姓名 as name2,d3.员工姓名 as name3,d4.员工姓名 as name4,d5.员工姓名 as name5,d6.员工姓名 as name6,d7.员工姓名 as name7,d8.员工姓名 as name8
- ,d9.员工姓名 as name9,d10.员工姓名 as name10";
- $query = Db::name('设备_产量计酬')->alias('a')->field($fields);
- // 连接 dic_lzde 表
- $query->join('dic_lzde b', 'a.sczl_dedh = b.sys_bh', 'LEFT');
- // 连接 工单_工艺资料 表
- $query->join('工单_工艺资料 c', 'a.sczl_gdbh = c.Gy0_gdbh AND a.sczl_yjno = c.Gy0_yjno AND a.sczl_gxh = c.Gy0_gxh', 'LEFT');
- // 循环连接 人事_基本资料 表(仅当 sczl_bh 不为空时才连接)
- for ($i = 1; $i <= 10; $i++) {
- $field = 'a.sczl_bh' . $i;
- $alias = 'd' . $i;
- $query->join("人事_基本资料 $alias", "$field = {$alias}.员工编号 AND {$field} IS NOT NULL", 'LEFT');
- }
- $query->where($where)->where('a.sczl_jtbh', 'in', $jtbhs);
- $list = $query->order('a.sczl_rq')->group('UniqId')->select();
- $UniqId = \db('绩效工资汇总')->field('UniqID')->order('UniqID desc')->find();
- if (empty($UniqId)) {
- $UniqId = 1;
- } else {
- $UniqId = $UniqId['UniqID'] + 1;
- }
- $data = [];
- /**
- * 设备_产量计酬数据
- */
- foreach ($list as $value) {
- $num = 1;
- $value['班组车头产量'] = $value['班组车头产量'] - $value['sczl_zcfp'];
- //计件产量
- if (substr($value['sczl_jtbh'], 0, 2) == 'JP') {//检品机
- if ($value['sczl_废品率系数'] == 0) {
- $gx_rate = 1;
- } else {
- $gx_rate = $value['sczl_废品率系数'];
- }
- $value['班组车头产量'] = $value['班组车头产量'] * $value['sczl_Pgcl'];
- $byThePieceYield = round($value['班组车头产量'] * $value['sczl_废品率系数']);//班组计件核算产量
- } 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') {//凹印机
- if ($value['sczl_工价系数'] == '0.000' || floatval($value['sczl_工价系数']) <= 0) {
- //工序难度系数
- $gx_rate = $value['工序难度系数'];
- if (floatval($value['工序难度系数']) <= 0 || empty($value['工序难度系数'])) {
- $gx_rate = '1.0000';
- }
- } else {
- if (floatval($value['工序难度系数']) > 0) {
- $gx_rate = number_format($value['sczl_工价系数'] * $value['工序难度系数'], 3);
- } else {
- $gx_rate = $value['sczl_工价系数'];
- }
- }
- if (str_contains($value['印刷方式'], '张') && $value['版距'] > 0) {
- $value['版距'] = $value['版距'] / 1000;
- $value['班组车头产量'] = $value['班组车头产量'] * $value['版距'];
- }
- $byThePieceYield = str_replace(',', '', round($value['班组车头产量'] * floatval($gx_rate)));
- } else {
- if ($value['sczl_jtbh'] === 'YSY02#' || $value['sczl_jtbh'] === 'YSY08#' || $value['sczl_jtbh'] === 'YSY10#' || $value['sczl_jtbh'] === 'SY03#') {
- $num = 1.1;
- }
- if ($value['sczl_工价系数'] == '0.000' || floatval($value['sczl_工价系数']) <= 0) {
- //工序难度系数
- $gx_rate = $value['工序难度系数'];
- if (floatval($value['工序难度系数']) <= 0 || empty($value['工序难度系数'])) {
- $gx_rate = '1.0000';
- }
- } else {
- if (floatval($value['工序难度系数']) > 0) {
- $gx_rate = number_format($value['sczl_工价系数'] * $value['工序难度系数'], 3);
- } else {
- $gx_rate = $value['sczl_工价系数'];
- }
- }
- $byThePieceYield = round($value['班组车头产量'] * floatval($gx_rate) * $num);
- }
- //补产产量/班组换算产量
- $afterProductionYield = ($value['装版工时'] + $value['保养工时'] + $value['打样工时']) * $value['补产标准'];
- //核算产量
- $accountingYield = $byThePieceYield + $afterProductionYield;
- //工时占比
- if ($value['日定额'] > 0) {
- $manHourRate = number_format($accountingYield / $value['日定额'], 4);
- } else {
- $manHourRate = '0.0000';
- }
- for ($i = 1; $i < 11; $i++) {
- $bhKey = 'sczl_bh' . $i;
- $xmKey = 'name' . $i;
- $rateKey = 'sczl_rate' . $i;
- if (!empty($value[$bhKey]) && $value[$bhKey] != '0000') {
- $item = [];
- $item['sczl_gdbh'] = $value['sczl_gdbh'];
- $item['sczl_yjno'] = $value['sczl_yjno'];
- $item['sczl_gxh'] = $value['sczl_gxh'];
- $item['sczl_type'] = $value['sczl_type'];
- $item['sczl_rq'] = $value['sczl_rq'];
- $item['sczl_jtbh'] = $value['sczl_jtbh'];
- $item['班组车头产量'] = $value['班组车头产量'];
- $item['工价系数'] = '0.0000';
- $item['工序难度系数'] = $gx_rate * $num;
- $item['装版工时'] = $value['装版工时'];
- $item['保养工时'] = $value['保养工时'];
- $item['打样工时'] = $value['打样工时'];
- $item['异常停机工时'] = $value['异常停机工时'];
- $item['车头产量占用机时'] = $value['车头产量占用机时'];
- $item['日定额'] = (int)$value['日定额'];
- $item['千件工价'] = $value['千件工价'];
- $item['补产标准'] = $value['补产标准'];
- $item['班组换算产量'] = $afterProductionYield;
- $item['计时补差额工资'] = '0.00';
- $item['bh'] = $value[$bhKey];
- $item['xm'] = $value[$xmKey];
- $item['Rate'] = $value[$rateKey];
- $item['sczl_ms'] = $value['sczl_ms'];
- $item['核算产量'] = $accountingYield;
- $item['工时占比'] = $manHourRate;
- array_push($data, $item);
- }
- }
- }
- /**
- * 拆片工序数据
- */
- $query = Db::name('db_sczl')->alias('a')
- ->field('a.sczl_gdbh, a.sczl_yjno, a.sczl_gxh, sczl_type, a.sczl_rq, a.sczl_jtbh,
- a.sczl_ms, a.sczl_cl as 班组车头产量, a.sczl_fp as sczl_zcfp, a.sczl_装版工时 as 装版工时, a.sczl_保养工时 as 保养工时,
- a.sczl_打样工时 as 打样工时, a.sczl_异常停机工时 as 异常停机工时, a.sczl_设备运行工时 as 车头产量占用机时, a.sczl_bh1,
- a.sczl_rate1, b.千件工价, b.日定额, b.补产标准,a.sczl_工价系数 as 工序难度系数,a.拆片联拼系数,a.拆片条小盒系数, d.员工姓名')
- ->join('dic_lzde b', 'a.sczl_dedh = b.sys_bh', 'left')
- ->join('工单_工艺资料 c', 'a.sczl_gdbh = c.Gy0_gdbh AND a.sczl_yjno = c.Gy0_yjno AND a.sczl_gxh = c.Gy0_gxh', 'left')
- ->join('人事_基本资料 d', 'a.sczl_bh1 = d.员工编号', 'left')
- ->where($where)
- ->select();
- foreach ($query as $value) {
- $num = 1;
- $value['班组车头产量'] = ($value['班组车头产量'] - $value['sczl_zcfp']) * $value['拆片联拼系数'] * $value['拆片条小盒系数'];
- //计件产量
- if ($value['sczl_jtbh'] === 'YSY02#' || $value['sczl_jtbh'] === 'YSY08#' || $value['sczl_jtbh'] === 'YSY10#' || $value['sczl_jtbh'] === 'SY03#') {
- $num = 1.1;
- }
- if ($value['工序难度系数'] <= 0 || empty($value['工序难度系数'])) {
- $value['工序难度系数'] = '1.0000';
- $byThePieceYield = $value['班组车头产量'];
- } else {
- $byThePieceYield = round($value['班组车头产量'] * $value['工序难度系数'] * $num);
- }
- //补产产量/班组换算产量
- $afterProductionYield = ($value['装版工时'] + $value['保养工时'] + $value['打样工时']) * $value['补产标准'];
- //核算产量
- $accountingYield = $byThePieceYield + $afterProductionYield;
- //工时占比
- if ($value['日定额'] > 0) {
- $manHourRate = number_format($accountingYield / $value['日定额'], 4);
- } else {
- $manHourRate = '0.0000';
- }
- $item = [];
- $item['sczl_gdbh'] = $value['sczl_gdbh'];
- $item['sczl_yjno'] = $value['sczl_yjno'];
- $item['sczl_gxh'] = $value['sczl_gxh'];
- $item['sczl_type'] = $value['sczl_type'];
- $item['sczl_rq'] = $value['sczl_rq'];
- $item['sczl_jtbh'] = $value['sczl_jtbh'];
- $item['班组车头产量'] = $value['班组车头产量'];
- $item['工价系数'] = '0.0000';
- $item['工序难度系数'] = $value['工序难度系数'] * $num;
- $item['装版工时'] = $value['装版工时'];
- $item['保养工时'] = $value['保养工时'];
- $item['打样工时'] = $value['打样工时'];
- $item['异常停机工时'] = $value['异常停机工时'];
- $item['车头产量占用机时'] = $value['车头产量占用机时'];
- $item['日定额'] = (int)$value['日定额'];
- $item['千件工价'] = $value['千件工价'];
- $item['补产标准'] = $value['补产标准'];
- $item['班组换算产量'] = $afterProductionYield;
- $item['计时补差额工资'] = '0.00';
- $item['bh'] = $value['sczl_bh1'];
- $item['xm'] = $value['员工姓名'];
- $item['Rate'] = $value['sczl_rate1'];
- $item['sczl_ms'] = $value['sczl_ms'];
- $item['核算产量'] = $accountingYield;
- $item['工时占比'] = floatval($manHourRate);
- array_push($data, $item);
- }
- /**
- * 手工检验工序数据
- */
- $shoujianfields = "a.sczl_gdbh,a.sczl_yjgx,sczl_gxmc AS sczl_type,a.sczl_rq,a.sczl_cl AS 班组车头产量,
- sczl_废品率系数 AS 工序难度系数,a.sczl_bh0,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,a.sczl_bh11,b.千件工价,b.日定额,b.补产标准,d0.员工姓名 AS name0,
- d1.员工姓名 AS name1,d2.员工姓名 AS name2,d3.员工姓名 AS name3,d4.员工姓名 AS name4,d5.员工姓名 AS name5,
- d6.员工姓名 AS name6,d7.员工姓名 AS name7,d8.员工姓名 AS name8,d9.员工姓名 AS name9,d10.员工姓名 AS name10,
- 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,
- 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,
- 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";
- $query = Db::name('db_手工检验')->alias('a')->field($shoujianfields);
- //链接dic_lzde表
- $query->join('dic_lzde b', 'a.sczl_dedh = b.sys_bh', 'LEFT');
- //链接人事基本资料表
- for ($i = 0; $i <= 12; $i++) {
- $field = 'a.sczl_bh' . $i;
- $alias = 'd' . $i;
- $query->join("人事_基本资料 $alias", "$field = {$alias}.员工编号 AND {$field} IS NOT NULL", 'LEFT');
- }
- $query->where($where);
- $list = $query->select();
- foreach ($list as $key => $value) {
- for ($i = 0; $i <= 12; $i++) {
- if (!empty($value['sczl_bh' . $i])) {
- $value['sczl_yjno'] = (int)substr($value['sczl_yjgx'], 0, 2);
- $value['sczl_gxh'] = (int)substr($value['sczl_yjgx'], 3, 2);
- //车头产量
- $value['班组车头产量'] = $value['sczl_cl' . $i] * $value['sczl_fp' . $i];
- //计件产量
- if ($value['工序难度系数'] <= 0 || empty($value['工序难度系数'])) {
- $value['工序难度系数'] = '1.0000';
- $value['计件产量'] = $value['班组车头产量'];
- } else {
- $value['计件产量'] = round($value['班组车头产量'] * $value['工序难度系数']);
- }
- //核算产量
- $value['核算产量'] = $value['计件产量'];
- //工时占比
- if ($value['日定额'] > 0) {
- $value['工时占比'] = round($value['计件产量'] / $value['日定额'], 4);
- } else {
- $value['工时占比'] = '0.0000';
- }
- $item = [];
- $item['sczl_gdbh'] = $value['sczl_gdbh'];
- $item['sczl_yjno'] = $value['sczl_yjno'];
- $item['sczl_gxh'] = $value['sczl_gxh'];
- $item['sczl_type'] = $value['sczl_type'];
- $item['sczl_rq'] = $value['sczl_rq'];
- $item['sczl_jtbh'] = '';
- $item['班组车头产量'] = $value['班组车头产量'];
- $item['工价系数'] = '0.0000';
- $item['工序难度系数'] = $value['工序难度系数'];
- $item['装版工时'] = '0.00';
- $item['保养工时'] = '0.00';
- $item['打样工时'] = '0.00';
- $item['异常停机工时'] = '0.00';
- $item['车头产量占用机时'] = '0.00';
- $item['日定额'] = (int)$value['日定额'];
- $item['千件工价'] = $value['千件工价'];
- $item['补产标准'] = $value['补产标准'];
- $item['班组换算产量'] = '0';
- $item['计时补差额工资'] = '0.00';
- $item['bh'] = $value['sczl_bh' . $i];
- $item['xm'] = $value['name' . $i];
- $item['Rate'] = '1.0000';
- $item['sczl_ms'] = '0.00';
- $item['核算产量'] = $value['核算产量'];
- $item['工时占比'] = floatval($value['工时占比']);
- array_push($data, $item);
- }
- }
- }
- /**
- * 包装计件工序数据
- */
- $result = Db::name('db_包装计件')->alias('a')
- ->field('a.sczl_gdbh1, a.sczl_gdbh2, a.sczl_gdbh3, a.sczl_gdbh4, a.sczl_gdbh5, a.sczl_gdbh6,
- a.sczl_yjGx1, a.sczl_yjGx2, a.sczl_yjGx3, a.sczl_yjGx4, a.sczl_yjGx5, a.sczl_yjGx6,
- 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,
- a.sczl_cl1, a.sczl_cl2, a.sczl_cl3, a.sczl_cl4, a.sczl_cl5, a.sczl_cl6,
- a.sczl_返工产量1, a.sczl_返工产量2, a.sczl_返工产量3, a.sczl_返工产量4, a.sczl_返工产量5, a.sczl_返工产量6,
- a.sczl_Jtbh1,a.sczl_Jtbh2,a.sczl_Jtbh3,a.sczl_Jtbh4,a.sczl_Jtbh5,a.sczl_Jtbh6,
- a.sczl_dedh1,a.sczl_dedh2,a.sczl_dedh3,a.sczl_dedh4,a.sczl_dedh5,a.sczl_dedh6,
- a.sczl_PgCl1,a.sczl_PgCl2,a.sczl_PgCl3,a.sczl_PgCl4,a.sczl_PgCl5,a.sczl_PgCl6,
- a.sczl_type1,a.sczl_type2,sczl_type3,a.sczl_type4,a.sczl_type5,sczl_type6,
- a.sczl_计产系数1,a.sczl_计产系数2,a.sczl_计产系数3,a.sczl_计产系数4,a.sczl_计产系数5,a.sczl_计产系数6,
- c1.工价系数 as 工序难度系数1,c2.工价系数 as 工序难度系数2,c3.工价系数 as 工序难度系数3,c4.工价系数 as 工序难度系数4,c5.工价系数 as 工序难度系数5,c6.工价系数 as 工序难度系数6,
- b1.千件工价 as 千件工价1, b2.千件工价 as 千件工价2, b3.千件工价 as 千件工价3, b4.千件工价 as 千件工价4, b5.千件工价 as 千件工价5, b6.千件工价 as 千件工价6,
- b1.日定额 as 日定额1, b2.日定额 as 日定额2, b3.日定额 as 日定额3, b4.日定额 as 日定额4, b5.日定额 as 日定额5, b6.日定额 as 日定额6,
- b1.补产标准 as 补产标准1, b2.补产标准 as 补产标准2, b3.补产标准 as 补产标准3, b4.补产标准 as 补产标准4, b5.补产标准 as 补产标准5, b6.补产标准 as 补产标准6,
- a.sczl_rq,a.sczl_bh,rtrim(d.员工姓名) as xm,
- e1.成品名称 as cpmc1,e2.成品名称 as cpmc2,e3.成品名称 as cpmc3,e4.成品名称 as cpmc4,e5.成品名称 as cpmc5,e6.成品名称 as cpmc6')
- ->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')
- ->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')
- ->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')
- ->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')
- ->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')
- ->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')
- ->join('dic_lzde b1', 'a.sczl_dedh1 = b1.sys_bh', 'LEFT')
- ->join('dic_lzde b2', 'a.sczl_dedh2 = b2.sys_bh', 'LEFT')
- ->join('dic_lzde b3', 'a.sczl_dedh3 = b3.sys_bh', 'LEFT')
- ->join('dic_lzde b4', 'a.sczl_dedh4 = b4.sys_bh', 'LEFT')
- ->join('dic_lzde b5', 'a.sczl_dedh5 = b5.sys_bh', 'LEFT')
- ->join('dic_lzde b6', 'a.sczl_dedh6 = b6.sys_bh', 'LEFT')
- ->join('人事_基本资料 d', 'a.sczl_bh = d.员工编号', 'LEFT')
- ->join('工单_基本资料 e1', 'a.sczl_gdbh1 = e1.Gd_gdbh AND a.sczl_gdbh1 IS NOT NULL', 'LEFT')
- ->join('工单_基本资料 e2', 'a.sczl_gdbh2 = e2.Gd_gdbh AND a.sczl_gdbh2 IS NOT NULL', 'LEFT')
- ->join('工单_基本资料 e3', 'a.sczl_gdbh3 = e3.Gd_gdbh AND a.sczl_gdbh3 IS NOT NULL', 'LEFT')
- ->join('工单_基本资料 e4', 'a.sczl_gdbh4 = e4.Gd_gdbh AND a.sczl_gdbh4 IS NOT NULL', 'LEFT')
- ->join('工单_基本资料 e5', 'a.sczl_gdbh5 = e5.Gd_gdbh AND a.sczl_gdbh5 IS NOT NULL', 'LEFT')
- ->join('工单_基本资料 e6', 'a.sczl_gdbh6 = e6.Gd_gdbh AND a.sczl_gdbh6 IS NOT NULL', 'LEFT')
- ->where($where)
- ->group('a.UniqId')
- ->select();
- foreach ($result as $value) {
- for ($i = 1; $i < 7; $i++) {
- $item = [];
- $gdbhKey = 'sczl_gdbh' . $i;
- $yjgxKey = 'sczl_yjGx' . $i;
- $jtbhKey = 'sczl_Jtbh' . $i;
- $gxmcKey = 'gxmc' . $i;
- $clKey = 'sczl_cl' . $i;
- $reworkKey = 'sczl_返工产量' . $i;
- $gxKey = '工序难度系数' . $i;
- $dedh = 'sczl_dedh' . $i;
- $thousandKey = '千件工价' . $i;
- $dailyKey = '日定额' . $i;
- $afterKey = '补产标准' . $i;
- $pgclKey = 'sczl_PgCl' . $i;
- $jcxsKey = 'sczl_计产系数' . $i;
- $cpmcKey = 'cpmc' . $i;
- $typekey = 'sczl_type' . $i;
- if (!empty($value[$gdbhKey])) {
- $item['sczl_gdbh'] = $value[$gdbhKey];
- $item['sczl_yjno'] = ltrim(substr($value[$yjgxKey], 0, 2), '0');
- $item['sczl_gxh'] = abs((int)substr($value[$yjgxKey], -2));
- $item['sczl_type'] = $value[$gxmcKey];
- $item['sczl_rq'] = $value['sczl_rq'];
- $item['sczl_jtbh'] = $value[$jtbhKey];
- $item['工价系数'] = '0.0000';
- $item['工序难度系数'] = $value[$jcxsKey];
- if ($value[$jcxsKey] <= 0) {
- $item['工序难度系数'] = '1.0000';
- }
- $item['装版工时'] = '0.00';
- $item['保养工时'] = '0.00';
- $item['打样工时'] = '0.00';
- $item['异常停机工时'] = '0.00';
- $item['车头产量占用机时'] = '0.00';
- $item['日定额'] = $value[$dailyKey];
- $item['千件工价'] = $value[$thousandKey];
- $item['补产标准'] = $value[$afterKey];
- $item['班组换算产量'] = '0.00';
- $item['计时补差额工资'] = '0.00';
- $item['bh'] = $value['sczl_bh'];
- $item['xm'] = $value['xm'];
- $item['Rate'] = 1.000;
- $item['sczl_ms'] = '0.00';
- $cl = $value[$clKey];
- if ($cl > 0) {
- if (str_contains($item['sczl_type'], '包装')) {
- $item['班组车头产量'] = $cl * $value[$pgclKey] / (int)$value[$typekey];
- } else {
- $item['班组车头产量'] = $cl;
- }
- $item['核算产量'] = $item['班组车头产量'] * $item['工序难度系数'];
- //工时占比
- if ($item['日定额'] > 0) {
- $manHourRate = number_format($item['核算产量'] / $item['日定额'], 4);
- } else {
- $manHourRate = '0.0000';
- }
- $item['工时占比'] = floatval($manHourRate);
- array_push($data, $item);
- }
- //返工
- if (!empty($value[$reworkKey]) && $value[$reworkKey] > 0) {
- $item['sczl_type'] = '返工(' . $item['sczl_type'] . ')';
- $cl = $value[$reworkKey];
- if (str_contains($item['sczl_type'], '包装')) {
- $item['班组车头产量'] = $cl * $value[$pgclKey] / (int)$value[$typekey];
- } else {
- $item['班组车头产量'] = $cl;
- }
- $item['核算产量'] = $item['班组车头产量'] * $item['工序难度系数'];
- if ($item['日定额'] > 0) {
- $manHourRate = number_format($item['核算产量'] / $item['日定额'], 4);
- } else {
- $manHourRate = '0.0000';
- }
- $item['工时占比'] = floatval($manHourRate);
- array_push($data, $item);
- }
- }
- }
- }
- //用于存储bh对应的工时占比总和
- $bhTotals = [];
- // 遍历原始数据
- foreach ($data as $row) {
- $bh = substr($row['sczl_rq'], 0, 10) . '-' . $row['bh'];
- // 初始化bh对应的工时占比总和为0
- if (!isset($bhTotals[$bh])) {
- $bhTotals[$bh] = 0;
- }
- // 将工时占比相加
- $bhTotals[$bh] += floatval($row['工时占比']);
- }
- //用usort函数对$data数组按照sczl_rq的日期部分进行升序排序
- usort($data, function ($a, $b) {
- return strtotime(substr($a['sczl_rq'], 0, 10)) - strtotime(substr($b['sczl_rq'], 0, 10));
- });
- $days = [];
- foreach ($data as $key => $item) {
- //统计每月出勤天数
- $day_bh = $item['bh'];
- if (!isset($days[$day_bh])) {
- $days[$day_bh] = [];
- array_push($days[$day_bh], $item['sczl_rq']);
- } else {
- if (in_array($item['sczl_rq'], $days[$day_bh]) == false) {
- array_push($days[$day_bh], $item['sczl_rq']);
- }
- }
- $bh = substr($item['sczl_rq'], 0, 10) . '-' . $item['bh'];
- //达标定额
- if ($item['工时占比'] > 0) {
- $standardQuota = floatval($item['工时占比'] / $bhTotals[$bh] * $item['日定额']);
- $data[$key]['达标定额'] = number_format($standardQuota, 2, '.', '');
- } else {
- $data[$key]['达标定额'] = number_format($item['班组车头产量'], 2, '.', '');
- }
- $date = substr($item['sczl_rq'], 0, 10);
- if (in_array($date, $vacationOneArr) || in_array($date, $vacationTwoArr)) {
- //计件工资
- $pieceWorkWage = 0;
- //加班工资
- $overTimePay = $item['核算产量'] / 1000 * $item['千件工价'] * $item['Rate'] * 3;
- //法定节假日,去除这天的考勤天数
- $days[$day_bh] = array_filter($days[$day_bh], function ($value) use ($item) {
- return $value !== $item['sczl_rq'];
- });
- } else {
- // 基础计件工资计算公式
- $baseWage = ($data[$key]['达标定额'] / 1000) * $item['千件工价'] * $item['Rate'];
- // 当有成品防护类型时(直接通过)
- if (strpos($item['sczl_type'], '成品防护') !== false) {
- $pieceWorkWage = $baseWage;
- } // 没有特殊类型时
- else {
- // 转换为数值类型避免计算错误
- $standardQuota = (float)$data[$key]['达标定额'];
- // 判断出勤天数是否超限
- if (count($days[$day_bh]) > $params['days']) {
- // 超限时重置定额
- $data[$key]['达标定额'] = '0.00';
- $pieceWorkWage = '0.00';
- $standardQuota = 0; // 同步数值类型
- } else {
- $pieceWorkWage = $baseWage;
- }
- }
- // 统一计算加班工资(所有情况都会计算)
- $overTimePay = ($item['核算产量'] - $data[$key]['达标定额']) / 1000 * $item['千件工价'] * $item['Rate'] * 1.5;
- }
- $data[$key]['个人计件工资'] = number_format($pieceWorkWage, 2, '.', '');
- $data[$key]['个人加班工资'] = number_format($overTimePay, 2, '.', '');
- $data[$key]['UniqID'] = $UniqId++;
- $data[$key]['sys_ny'] = $params['date'];
- $data[$key]['sys_rq'] = date('Y-m-d H:i:s');
- $data[$key]['sys_id'] = $params['sys_id'];
- $data[$key]['法定天数'] = $params['days'];
- $data[$key]['sczl_type'] = trim($item['sczl_type']);
- }
- $result = $this->calculateSalary($data);
- return [
- 'success' => true,
- 'message' => '工资计算完成',
- 'data' => [
- 'month' => $attendanceMonth,
- 'insert_count' => count($data),
- 'start_date' => $startDate,
- 'end_date' => $endDate
- ]
- ];
- }
- /**
- * 保存工资数据
- */
- protected function saveSalaryData(array $data): int
- {
- if (empty($data)) {
- return 0;
- }
- // 获取最大UniqID
- $maxUniqId = Db::name('绩效工资汇总')
- ->max('UniqID') ?? 0;
- // 准备插入数据
- $insertData = [];
- $currentUniqId = $maxUniqId + 1;
- foreach ($data as $item) {
- $insertData[] = [
- 'sczl_gdbh' => $item['sczl_gdbh'],
- 'sczl_yjno' => $item['sczl_yjno'],
- 'sczl_gxh' => $item['sczl_gxh'],
- 'sczl_type' => $item['sczl_type'],
- 'sczl_rq' => $item['sczl_rq'],
- 'sczl_jtbh' => $item['sczl_jtbh'],
- '班组车头产量' => $item['班组车头产量'],
- '工价系数' => $item['工价系数'],
- '工序难度系数' => $item['工序难度系数'],
- '装版工时' => $item['装版工时'],
- '保养工时' => $item['保养工时'],
- '打样工时' => $item['打样工时'],
- '异常停机工时' => $item['异常停机工时'],
- '车头产量占用机时' => $item['车头产量占用机时'],
- '日定额' => $item['日定额'],
- '千件工价' => $item['千件工价'],
- '补产标准' => $item['补产标准'],
- '班组换算产量' => $item['班组换算产量'],
- '计时补差额工资' => $item['计时补差额工资'],
- 'bh' => $item['bh'],
- 'xm' => $item['xm'],
- 'Rate' => $item['Rate'],
- 'sczl_ms' => $item['sczl_ms'],
- '工时占比' => $item['工时占比'],
- '达标定额' => $item['达标定额'],
- '个人计件工资' => $item['个人计件工资'],
- '个人加班工资' => $item['个人加班工资'],
- 'UniqID' => $currentUniqId++,
- 'sys_ny' => $item['sys_ny'],
- 'sys_rq' => $item['sys_rq'],
- 'sys_id' => $item['sys_id'],
- '法定天数' => $item['法定天数'],
- '核算产量' => $item['核算产量'] ?? 0,
- ];
- }
- // 批量插入
- $sql = Db::name('绩效工资汇总')->fetchSql(true)->insertAll($insertData);
- $result = Db::query($sql);
- return $result ? count($insertData) : 0;
- }
- }
|