浏览代码

新增计件工资接口

huangsanjia 1 年之前
父节点
当前提交
2150f1f23d
共有 1 个文件被更改,包括 242 次插入0 次删除
  1. 242 0
      application/api/controller/StaffSalary.php

+ 242 - 0
application/api/controller/StaffSalary.php

@@ -0,0 +1,242 @@
+<?php
+namespace app\api\controller;
+
+use app\common\controller\Api;
+use \think\Request;
+use think\Db;
+
+/**
+ * 员工计件工资核算
+*/
+class StaffSalary extends Api
+{
+    protected $noNeedLogin = ['*'];
+    protected $noNeedRight = ['*'];
+
+    /**
+     * 首页
+     *
+     */
+    public function index()
+    {
+        $this->success('请求成功');
+    }
+    /**
+     * 计算员工计件工资
+     * @ApiMethod POST
+     * @param string date   考勤年月
+     * @param string start_date 开始日期
+     * @param string end_date   结束日期
+     * @param string vacation_one_start 法定假日1 开始时间
+     * @param string vacation_one_end   法定假日1 结束时间
+     * @param string vacation_two_start 法定假日2 开始时间
+     * @param string vacation_two_end   法定假日2 结束时间
+    */
+    public function staffSalaryCount(){
+        if (Request::instance()->isPost() == false){
+            $this->error('非法请求');
+        }
+        $params = Request::instance()->param();
+        if (!isset($params['start_date']) || !isset($params['end_date']) || empty($params['start_date']) || empty($params['end_date']) || !isset($params['date']) || empty($params['date']))
+        {
+            $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));
+            }
+        }
+        $startDate = $params['start_date'];
+        $endDate = $params['end_date'];
+        $where = [];
+        $where['a.sczl_rq'] = ['between',[$startDate,$endDate]];
+        $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,
+                a.sczl_装版工时 as 装版工时,a.sczl_保养工时 as 保养工时,a.sczl_打样工时 as 打样工时,a.sczl_异常停机工时 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,
+                b.千件工价,b.日定额,b.补产标准,c.工价系数 as 工序难度系数
+                ,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('设备_产量计酬')->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);
+//        $list = $query->select();
+        $UniqId = \db('绩效工资汇总_temp')->field('UniqID')->order('UniqID desc')->find();
+        if (empty($UniqId)){
+            $UniqId = 1;
+        }else{
+            $UniqId = $UniqId['UniqID'];
+        }
+        $data = [];
+        //设备_产量计酬数据
+//        foreach ($list as $value){
+//            $value['班组车头产量'] = $value['班组车头产量'] - $value['sczl_zcfp'];
+//            //计件产量
+//            if ($value['工序难度系数'] <= 0 || empty($value['工序难度系数'])){
+//                $value['工序难度系数'] = '1.0000';
+//                $byThePieceYield = $value['班组车头产量'];
+//            }else{
+//                $byThePieceYield = round($value['班组车头产量'] * $value['工序难度系数']);
+//            }
+//            //补产产量/班组换算产量
+//            $afterProductionYield = ($value['装版工时'] + $value['保养工时'] + $value['打样工时']) * $value['补产标准'];
+//            //核算产量
+//            $accountingYield = $byThePieceYield + $afterProductionYield;
+//            //工时占比
+//            $manHourRate = number_format($accountingYield / $value['日定额'],4);
+//            for ($i=1; $i<11; $i++){
+//                $bhKey = 'sczl_bh'.$i;
+//                $xmKey = 'name'.$i;
+//                $rateKey = 'sczl_rate'.$i;
+//                if (!empty($value[$bhKey]) && $value[$bhKey] != '000000'){
+//                    $item = [];
+//                    $item['sczl_gdbh'] = $value['sczl_gdbh'];
+//                    $item['sczl_yjno'] = $value['sczl_yjno'];
+//                    $item['sczl_gxh'] = $value['sczl_gxh'];
+//                    $item['sczl_type'] = substr($value['sczl_type'],0,30);
+//                    $item['sczl_rq'] = $value['sczl_rq'];
+//                    $item['sczl_jtbh'] = $value['sczl_jtbh'];
+//                    $item['班组车头产量'] = $value['班组车头产量'];
+//                    $item['工价系数'] = '0.0000';
+//                    $item['工序难度系数'] = $value['工序难度系数'];
+//                    $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['工时占比'] = floatval($manHourRate);
+//                    array_push($data,$item);
+//                }
+//            }
+//        }
+        //拆片工序数据
+        $query = Db::table('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.补产标准, c.工价系数 as 工序难度系数, 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)
+//            ->fetchSql(true)
+            ->select();
+//        halt($query);
+        foreach ($query as $value){
+            $value['班组车头产量'] = $value['班组车头产量'] - $value['sczl_zcfp'];
+            //计件产量
+            if ($value['工序难度系数'] <= 0 || empty($value['工序难度系数'])){
+                $value['工序难度系数'] = '1.0000';
+                $byThePieceYield = $value['班组车头产量'];
+            }else{
+                $byThePieceYield = round($value['班组车头产量'] * $value['工序难度系数']);
+            }
+            //补产产量/班组换算产量
+            $afterProductionYield = ($value['装版工时'] + $value['保养工时'] + $value['打样工时']) * $value['补产标准'];
+            //核算产量
+            $accountingYield = $byThePieceYield + $afterProductionYield;
+            //工时占比
+            $manHourRate = number_format($accountingYield / $value['日定额'],4);
+            $item = [];
+            $item['sczl_gdbh'] = $value['sczl_gdbh'];
+            $item['sczl_yjno'] = $value['sczl_yjno'];
+            $item['sczl_gxh'] = $value['sczl_gxh'];
+            $item['sczl_type'] = substr($value['sczl_type'],0,30);
+            $item['sczl_rq'] = $value['sczl_rq'];
+            $item['sczl_jtbh'] = $value['sczl_jtbh'];
+            $item['班组车头产量'] = $value['班组车头产量'];
+            $item['工价系数'] = '0.0000';
+            $item['工序难度系数'] = $value['工序难度系数'];
+            $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);
+        }
+        //手工检验工序数据
+
+
+//        halt($data);
+        // 用于存储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['工时占比']);
+        }
+//        halt($bhTotals);
+        foreach ($data as $key=>$item){
+            $bh = substr($item['sczl_rq'],0,10) . '-' .$item['bh'];
+            //达标定额
+            $standardQuota = floatval($item['工时占比'] / $bhTotals[$bh] * $item['日定额']);
+            $data[$key]['达标定额'] = number_format($standardQuota,2,'.', '');
+            $date = substr($item['sczl_rq'],0,10);
+            if (in_array($date,$vacationOneArr) || in_array($date,$vacationTwoArr)){
+                //计件工资
+                $pieceWorkWage = $standardQuota/1000*$item['千件工价']*$item['Rate']*3;
+                //加班工资
+                $overTimePay = ($item['核算产量'] - $standardQuota) / 1000 *$item['千件工价'] * $item['Rate'] *1.5*3;
+            }else{
+                $pieceWorkWage = $standardQuota/1000*$item['千件工价']*$item['Rate'];
+                $overTimePay = ($item['核算产量'] - $standardQuota) / 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'];
+            unset($data[$key]['核算产量']);
+        }
+        halt($data);
+        $res = \db('绩效工资汇总_temp')->insertAll($data);
+
+    }
+}