Ver Fonte

Merge branch 'master' of http://47.100.37.243:10191/wutt/manHourHousekeeper into master

seyason há 1 ano atrás
pai
commit
3a3eea782c
17 ficheiros alterados com 566 adições e 101 exclusões
  1. 10 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/PlanController.java
  2. 2 2
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ReportController.java
  3. 9 2
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/ProdProcedureTeam.java
  4. 1 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/mapper/ReportMapper.java
  5. 1 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ReportService.java
  6. 11 2
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanServiceImpl.java
  7. 82 4
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  8. 2 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/ProdProcedureTeamMapper.xml
  9. 15 4
      fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/ReportMapper.xml
  10. 1 1
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/components/chooseSomeone.vue
  11. 9 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/router/index.js
  12. 6 5
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/planView/todayPlan/distribution.vue
  13. 190 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/statisticsView/statisticsDetail.vue
  14. 132 37
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/statisticsView/statisticsView.vue
  15. 1 1
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/orderInsert.vue
  16. 4 4
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/planComponent.vue
  17. 90 35
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/statistic/index.vue

+ 10 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/PlanController.java

@@ -1,10 +1,13 @@
 package com.management.platform.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.Plan;
 import com.management.platform.entity.PlanProcedureTotal;
+import com.management.platform.entity.PlanSteelStampNumber;
 import com.management.platform.entity.ProdProcedureTeam;
 import com.management.platform.service.PlanService;
+import com.management.platform.service.PlanSteelStampNumberService;
 import com.management.platform.util.HttpRespMsg;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.transaction.annotation.Transactional;
@@ -16,6 +19,7 @@ import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import java.util.List;
 
 /**
  * <p>
@@ -31,6 +35,8 @@ public class PlanController {
 
     @Resource
     private PlanService planService;
+    @Resource
+    private PlanSteelStampNumberService planSteelStampNumberService;
 
     @RequestMapping("/list")
     public HttpRespMsg list(String date,String steelStampNumber,@RequestParam(defaultValue = "3") Integer planType,Integer deptId,Integer pageIndex,Integer pageSize){
@@ -40,7 +46,10 @@ public class PlanController {
     @RequestMapping("/getById")
     public HttpRespMsg getById(Plan plan){
         HttpRespMsg httpRespMsg=new HttpRespMsg();
-        httpRespMsg.setData(planService.getById(plan.getId()));
+        Plan byId = planService.getById(plan.getId());
+        List<PlanSteelStampNumber> planSteelStampNumbers = planSteelStampNumberService.list(new QueryWrapper<PlanSteelStampNumber>().eq("plan_id", plan.getId()));
+        byId.setSteelStampNumberList(planSteelStampNumbers);
+        httpRespMsg.setData(byId);
         return httpRespMsg;
     }
 

+ 2 - 2
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ReportController.java

@@ -1519,8 +1519,8 @@ public class ReportController {
     }
 
     @RequestMapping("getPersonWorkHoursWagesDetail")
-    public HttpRespMsg getPersonWorkHoursWagesDetail(String date,String userId){
-        return reportService.getPersonWorkHoursWagesDetail(date,userId);
+    public HttpRespMsg getPersonWorkHoursWagesDetail(String date,String userId,String startDate,String endDate,Integer checkStatus,Integer detailStatus){
+        return reportService.getPersonWorkHoursWagesDetail(date,userId,startDate,endDate,checkStatus,detailStatus);
     }
 
     @RequestMapping("exportPersonWorkHoursWorkTime")

+ 9 - 2
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/ProdProcedureTeam.java

@@ -20,7 +20,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2023-08-02
+ * @since 2023-08-30
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -80,14 +80,21 @@ public class ProdProcedureTeam extends Model<ProdProcedureTeam> {
     private Integer planProcedureId;
 
     /**
-     * 员工执行状态:0-待接收,1-进行中,2-已完工,3-已中止(员工自己中止或者管理端中止)
+     * 员工执行状态:0-待接收,1-进行中,2-已完工,3-已中止(员工自己中止或者管理端中止)4-已换人
      */
     @TableField("status")
     private Integer status;
 
+
     @TableField(exist = false)
     private User user;
 
+    /**
+     * 是否为更换人员动作
+     */
+    @TableField("is_change")
+    private Integer isChange;
+
 
     @Override
     protected Serializable pkVal() {

+ 1 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/mapper/ReportMapper.java

@@ -184,7 +184,7 @@ public interface ReportMapper extends BaseMapper<Report> {
 
     List<Map<String, Object>> getPersonWorkHoursWagesList(Integer companyId, String startDate, String endDate, String deptId, String userId);
 
-    List<Map<String, Object>> getPersonWorkHoursWagesDetail(String date, String userId, Integer companyId);
+    List<Map<String, Object>> getPersonWorkHoursWagesDetail(String date, String userId, Integer companyId,String startDate,String endDate,Integer checkStatus,Integer detailStatus);
 
     List<Map<String, Object>> getPlanRealTimeProgressList(Integer companyId,String deptId, String userId, String startDate, String endDate, Integer pageStart, Integer pageSize);
 

+ 1 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ReportService.java

@@ -119,7 +119,7 @@ public interface ReportService extends IService<Report> {
 
     HttpRespMsg getPersonWorkHoursWagesList(String deptId, String userId, String startDate, String endDate, Integer pageIndex, Integer pageSize);
 
-    HttpRespMsg getPersonWorkHoursWagesDetail(String date, String userId);
+    HttpRespMsg getPersonWorkHoursWagesDetail(String date, String userId,String startDate,String endDate,Integer checkStatus,Integer detailStatus);
 
     HttpRespMsg exportPersonWorkHoursWorkTime(String deptId, String userId, String startDate, String endDate);
 

+ 11 - 2
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanServiceImpl.java

@@ -971,6 +971,7 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
         p.setId(null);
         p.setUserId(newPeopleId);
         p.setStatus(0);
+        p.setIsChange(0);
         prodProcedureTeam.setStatus(4);
         list.add(prodProcedureTeam);
         list.add(p);
@@ -1037,6 +1038,9 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
                     prodProcedureTeam.setWorkTime(totalWorkingHours.doubleValue());
                     prodProcedureTeam.setJobOfMoney(totalWages);
                 }
+                if(plan.getPlanType()==1){
+                    prodProcedureTeam.setStatus(1);
+                }
                 list.add(prodProcedureTeam);
             }
             List<WxCorpInfo> wxCorpInfoList = wxCorpInfoService.list(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
@@ -1059,9 +1063,14 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
                 }
 
             }
+        }else {
+            msg.setError("请选择人员");
+            return msg;
         }
-        if(!prodProcedureTeamService.saveOrUpdateBatch(list)){
-            msg.setError("验证失败");
+        if(list.size()>0){
+            if(!prodProcedureTeamService.saveOrUpdateBatch(list)){
+                msg.setError("验证失败");
+            }
         }
         return msg;
     }

+ 82 - 4
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -1,10 +1,10 @@
 package com.management.platform.service.impl;
 
-import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fasterxml.jackson.databind.JsonNode;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.*;
 import com.management.platform.mapper.*;
@@ -4260,14 +4260,92 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     }
 
     @Override
-    public HttpRespMsg getPersonWorkHoursWagesDetail(String date, String userId) {
-        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
-        List<Map<String,Object>> mapList=reportMapper.getPersonWorkHoursWagesDetail(date,userId,companyId);
+    public HttpRespMsg getPersonWorkHoursWagesDetail(String date, String userId,String startDate,String endDate,Integer checkStatus,Integer detailStatus) {
+        User user = userMapper.selectById(request.getHeader("token"));
+        if(checkStatus!=null&&StringUtils.isEmpty(userId)){
+            userId=user.getId();
+        }
+        List<Map<String,Object>> mapList=reportMapper.getPersonWorkHoursWagesDetail(date,userId,user.getCompanyId(),startDate,endDate,checkStatus,detailStatus);
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         HashMap map=new HashMap();
         map.put("record",mapList);
         map.put("totalWorkingTime",mapList.stream().mapToDouble(mt->Double.valueOf(String.valueOf(mt.get("working_time")))).sum());
         map.put("totalCost",mapList.stream().mapToDouble(mt->Double.valueOf(String.valueOf(mt.get("cost")))).sum());
+        if(checkStatus!=null && detailStatus==null){
+            DateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            DateTimeFormatter dtf1=DateTimeFormatter.ofPattern("yyyyMMdd");
+            List<LocalDate> allDateList = getDays(LocalDate.parse(startDate, dtf), LocalDate.parse(endDate, dtf));
+            List<String> dataStringList=new ArrayList<>();
+            //补全日期列表
+            for (LocalDate localDate : allDateList) {
+                dataStringList.add(localDate.format(dtf1));
+            }
+            map=new HashMap();
+            List<String> dateList = mapList.stream().map(m -> String.valueOf(m.get("createDate"))).distinct().collect(Collectors.toList());
+            dateList.addAll(dataStringList.stream().filter(dl->!dateList.contains(dl)).collect(Collectors.toList()));
+            List<String> stringList = dateList.stream().sorted().collect(Collectors.toList());
+            Map<Object, List<Map<String, Object>>> listMap = mapList.stream().collect(Collectors.groupingBy(m -> m.get("createDate")));
+            List<Map<String,Object>> resultList=new ArrayList<>();
+            List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", user.getCompanyId()));
+            List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()).eq("manager_id", user.getId()));
+            List<DepartmentOtherManager> departmentOtherManagers = departmentOtherManagerMapper.selectList(new QueryWrapper<DepartmentOtherManager>().eq("company_id", user.getCompanyId()).eq("other_manager_id", user.getId()));
+            List<Integer> deptIds = departmentList.stream().map(Department::getDepartmentId).distinct().collect(Collectors.toList());
+            List<Integer> otherDeptIds = departmentOtherManagers.stream().map(DepartmentOtherManager::getDepartmentId).distinct().collect(Collectors.toList());
+            deptIds.addAll(otherDeptIds);
+            List<Integer> targetDeptIds = deptIds.stream().distinct().collect(Collectors.toList());
+            boolean canViewAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部人员工时工价");
+            for (String s : stringList) {
+                Map<String,Object> item=new HashMap();
+                List<Map<String, Object>> list = listMap.get(s);
+                item.put("createDate",s);
+                //补全的日期无数据的情况 手填填入
+                if(list==null){
+                    list=new ArrayList<>();
+                    Map<String,Object> ob=new HashMap<>();
+                    ob.put("creator_id",user.getId());
+                    ob.put("creatorName",user.getName());
+                    ob.put("working_time",0);
+                    ob.put("cost",0);
+                    list.add(ob);
+                }
+                Map<Object, Map<String, Object>> mapMap = list.stream().collect(Collectors.groupingBy(m -> m.get("creator_id"), Collectors.collectingAndThen(Collectors.toList(), i -> {
+                    Map<String, Object> retMap = new HashMap<>();
+                    double working_time = i.stream().mapToDouble(mmm -> Double.valueOf(String.valueOf(mmm.get("working_time")==null?0:mmm.get("working_time")))).sum();
+                    double cost = i.stream().mapToDouble(mmm -> Double.valueOf(String.valueOf(mmm.get("cost")==null?0:mmm.get("cost")))).sum();
+                    retMap.put("working_time", working_time);
+                    retMap.put("creatorName",i.get(0).get("creatorName"));
+                    retMap.put("creatorId",i.get(0).get("creator_id"));
+                    retMap.put("cost", cost);
+                    return retMap;
+                })));
+                List<String> creatorId = list.stream().map(m -> String.valueOf(m.get("creator_id"))).distinct().collect(Collectors.toList());
+                List<Map<String,Object>> theData=new ArrayList<>();
+                for (String id : creatorId) {
+                    Map<String, Object> nameItem = mapMap.get(id);
+                    theData.add(nameItem);
+                }
+                if(checkStatus==1){
+                    List<User> users = userList.stream().filter(ul -> !theData.stream().anyMatch(td -> td.get("creatorId").equals(ul.getId()))).collect(Collectors.toList());
+                    for (User u : users) {
+                        if(canViewAll?(targetDeptIds.size()>0):(targetDeptIds.size()>0&&targetDeptIds.contains(u.getDepartmentId()))){
+                            Map<String, Object> nameItem =new HashMap<>();
+                            nameItem.put("working_time", 0);
+                            nameItem.put("creatorName",u.getName());
+                            nameItem.put("creatorId",u.getId());
+                            nameItem.put("cost", 0);
+                            theData.add(nameItem);
+                        }
+                    }
+                }
+                item.put("subDataList",theData);
+                item.put("working_time",list.stream().mapToDouble(mt->Double.valueOf(String.valueOf(mt.get("working_time")))).sum());
+                item.put("cost",list.stream().mapToDouble(mt->Double.valueOf(String.valueOf(mt.get("cost")))).sum());
+                resultList.add(item);
+            }
+            map.put("record",resultList);
+            map.put("totalWorkingTime",resultList.stream().mapToDouble(mt->Double.valueOf(String.valueOf(mt.get("working_time")))).sum());
+            map.put("totalCost",resultList.stream().mapToDouble(mt->Double.valueOf(String.valueOf(mt.get("cost")))).sum());
+        }
         httpRespMsg.setData(map);
         return httpRespMsg;
     }

+ 2 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/ProdProcedureTeamMapper.xml

@@ -15,11 +15,12 @@
         <result column="update_time" property="updateTime" />
         <result column="plan_procedure_id" property="planProcedureId" />
         <result column="status" property="status" />
+        <result column="is_change" property="isChange" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, company_id, user_id, work_time, job_of_money, progress, checker_id, checker_name, update_time, plan_procedure_id, status
+        id, company_id, user_id, work_time, job_of_money, progress, checker_id, checker_name, update_time, plan_procedure_id, status, is_change
     </sql>
 
     <select id="getReportForWorkList" resultType="java.util.HashMap" >

+ 15 - 4
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/ReportMapper.xml

@@ -150,20 +150,31 @@
     </select>
 
     <select id="getPersonWorkHoursWagesDetail" resultType="java.util.Map">
-        select r.*,pp.name as procedureName,(case  when pp.check_type=0 then '自检' when pp.check_type=1 then '互检' else '专检' end) as checkType,
+        select r.*,DATE_FORMAT(r.create_date,'%Y%m%d') as createDate,pp.name as procedureName,(case  when pp.check_type=0 then '自检' when pp.check_type=1 then '互检' else '专检' end) as checkType,
         p.name as productName,DATE_FORMAT(plan.start_date,'%Y%m%d') as planStartDate,DATE_FORMAT(plan.end_date,'%Y%m%d') as planEndDate ,
-        plan.task_change_notice_num as taskName,plan.plan_type as planType,u.name as checkerName
+        plan.task_change_notice_num as taskName,plan.plan_type as planType,u.name as checkerName,u2.name as creatorName
         from report r
         left join prod_procedure pp on r.prod_procedure_id=pp.id
         left join product p on p.id=r.product_id
         left join plan on plan.id=r.plan_id
         left join user u on r.checker_id=u.id
+        left join user u2 on r.creator_id=u2.id
         where r.company_id=#{companyId}
         <if test="date!=null and date!=''">
             and r.create_date=#{date}
         </if>
         <if test="userId!=null and userId!=''">
-            and r.creator_id=#{userId}
+            <choose>
+                <when test="checkStatus!=null and checkStatus==1 and detailStatus==null">
+                    and plan.foreman_id=#{userId}
+                </when>
+                <otherwise>
+                    and r.creator_id=#{userId}
+                </otherwise>
+            </choose>
+        </if>
+        <if test="startDate!=null and endDate!=null">
+            and r.create_date between #{startDate} and #{endDate}
         </if>
     </select>
 
@@ -185,7 +196,7 @@
         <if test="startDate!=null and startDate!='' and endDate!=null and endDate!=''">
             and (b.start_date &gt;= #{startDate} and b.end_date &lt;= #{endDate})
         </if>
-        order by b.create_time,a.id desc
+        order by b.create_time desc ,a.id
         <if test="pageStart!=null and pageSize!=null">
             limit #{pageStart},#{pageSize}
         </if>

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/components/chooseSomeone.vue

@@ -48,7 +48,7 @@
       <van-button round type="info" size="small" :loading="loadingBtn" @click="handClick()">确定</van-button>
     </div>
     <div class="chooseSomeone_btn" v-if="!newGroupViewBack">
-      <van-button round type="info" size="small" style="width: 100%;" @click="treeHandClick()">确定</van-button>
+      <van-button round type="info" size="small" style="width: 100%;" :loading="loadingBtn" @click="treeHandClick()">确定</van-button>
     </div>
   </div>
 </template>

+ 9 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/router/index.js

@@ -86,6 +86,15 @@ const router = new Router({
             keepAlive: false
         }
     },
+    {
+        path: "/statisticsDetail",
+        // path: "/statistic",
+        component: () => import("@/views/statisticsView/statisticsDetail"),
+        meta: {
+            title: "数据统计",
+            keepAlive: false
+        }
+    },
     {
         path: "/groupView",
         component: () => import("@/views/groupView/groupView"),

+ 6 - 5
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/planView/todayPlan/distribution.vue

@@ -16,13 +16,13 @@
             <span>{{ item.prodProcedure.name }}</span>
           </div>
           <div class="PlanItem">
-            <div>单件工价:</div><span class="textBeyondHiding">{{ item.prodProcedure.workingTime }}</span>
+            <div>单件工价:</div><span class="textBeyondHiding">{{ item.prodProcedure.unitPrice }}</span>
           </div>
           <div class="PlanItem">
             <div>总工价:</div><span class="textBeyondHiding">{{ item.totalWages }}</span>
           </div>
           <div class="PlanItem">
-            <div>单件工时:</div><span class="textBeyondHiding">{{ item.prodProcedure.unitPrice }} min</span>
+            <div>单件工时:</div><span class="textBeyondHiding">{{ item.prodProcedure.workingTime }} min</span>
           </div>
           <div class="PlanItem">
             <div>总工时:</div><span class="textBeyondHiding">{{ item.totalWorkingHours }} min</span>
@@ -51,11 +51,11 @@
                             <span>{{ second_item.user.name }}</span>
                             <span>{{ second_item.status==0?"待接收":second_item.status==1?"进行中":second_item.status==2?"已完工":second_item.status==3?"已中止":"已换人"}}</span>
                             <span class="" v-if="second_item.status==3" @click="distributionProp(item,index,'change', second_item)"  style="color: #1989fa;">换人</span>
-                            <span class="" v-if="second_item.status==0" @click="deletePeople(second_item.id)"  style="color: #1989fa;">删除</span>
+                            <span class="" v-if="second_item.status==0&&second_item.isChange==1" @click="deletePeople(second_item.id)"  style="color: #1989fa;">删除</span>
                       </div>
-                      <div class="PlanItem">
+                      <p style="margin-top:20px;">
                         <span class="" v-if="beDeptList" @click="distributionProp(item,index,'add')"  style="color: #1989fa;">新增</span>
-                      </div>
+                      </p>
                     </div>
                 </div>
               </collapse>
@@ -472,6 +472,7 @@ export default {
             width: 50%;
             display: flex;
             padding-top: 12px;
+            
 
             &:first-child {
               width: 100%;

+ 190 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/statisticsView/statisticsDetail.vue

@@ -0,0 +1,190 @@
+<template>
+  <div>
+    <div class="top">
+      <van-nav-bar title="数据统计" left-text="返回"  @click-left="back" fixed left-arrow/>
+    </div>
+    <div class="bottom" style="position: relative;">
+        <van-cell-group>
+            <van-cell>总计:  工时:{{totalWorkingTime}}分钟   工价:{{totalCost}}元</van-cell>
+        </van-cell-group>
+        </div>
+          <div v-for="(item,index) in groupList" :key="index" :label="item">
+              <div class="mar_top10">{{item.productName}}</div>
+              <div class="mar_top10">{{item.planStartDate}}-{{item.planEndDate}}</div>
+              <div class="mar_top10">
+                <div style="padding:10px;border:1px solid #000">
+                  <div style="display:flex;align-item:middle">
+                    <div style="width:50%">
+                        <span v-if="item.planType==0">{{item.procedureName}}</span>
+                        <span v-else>{{item.taskName}}</span>
+                    </div>
+                    <div style="text-align:right;width:50%">{{item.working_time}}分钟</div>
+                  </div>
+                  <div style="display:flex;align-item:middle">
+                    <div style="width:25% ;color:#20A0F7">{{!item.progress?0:item.progress}}%</div>
+                    <div style="width:25% ;color:#20A0F7">{{item.cost}}</div>
+                    <div style="width:25% ;color:#20A0F7">{{item.checkType}}</div>
+                    <div style="width:25% ;color:#20A0F7">{{item.checkerName}}</div>
+                  </div>
+                  <div style="display:flex;align-item:middle">
+                    <div style="width:25%">进度</div>
+                    <div style="width:25%">工钱</div>
+                    <div style="width:25%">质检方式</div>
+                    <div style="width:25%">质检人</div>
+                  </div>
+                </div>
+              </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import Vue from "vue";
+import { ImagePreview } from "vant";
+import { DatetimePicker } from 'vant';
+import { Collapse, CollapseItem ,Cell, CellGroup } from 'vant';
+Vue.use(ImagePreview);
+Vue.use(Collapse);
+Vue.use(CollapseItem);
+Vue.use(Cell);
+Vue.use(CellGroup);
+export default {
+  props: {},
+  components: {},
+  data() {
+    return {
+      startDate:this.format(new Date(),"yyyy-MM-dd"),
+      endDate:this.format(new Date(),"yyyy-MM-dd"),
+      chooseType:'',
+      totalWorkingTime:0,
+      totalCost:0,
+      activeNames: ['1'],
+      checkStatus: '0',
+      groupList:[],
+      userId:''
+    };
+  },
+  computed: {},
+  watch: {},
+  created() {
+    this.startDate=this.$route.query.startDate
+    this.endDate=this.$route.query.endDate
+    this.checkStatus=this.$route.query.checkStatus
+    this.userId=this.$route.query.userId
+  },
+  mounted() {
+    this.getData()
+  },
+  methods: {
+    getData(){
+      let postData = {
+        startDate:this.startDate,
+        endDate:this.endDate,
+        checkStatus:this.checkStatus,
+        detailStatus:0,
+        userId:this.userId,
+      };
+      this.$axios.post("/report/getPersonWorkHoursWagesDetail", postData)
+        .then(res => {
+          this.saving = false;
+            if(res.code == "ok") {
+              this.groupList=res.data.record
+              this.totalWorkingTime=res.data.totalWorkingTime
+              this.totalCost=res.data.totalCost
+            } else {
+                this.$toast.fail(res.msg);
+            }
+        }).catch(err=> {this.$toast.clear();});
+    },
+    back() {
+      this.$router.push({
+            path:"/statisticsView",
+        })
+    },
+     // 时间转换
+    format(date, pattern) {
+        pattern = pattern || "yyyy-MM-dd";
+        var _this = this;
+        return pattern.replace(/([yMdhsm])(\1*)/g, function ($0) {
+            switch ($0.charAt(0)) {
+                case 'y': return _this.padding(date.getFullYear(), $0.length);
+                case 'M': return _this.padding(date.getMonth() + 1, $0.length);
+                case 'd': return _this.padding(date.getDate(), $0.length);
+                case 'w': return date.getDay() + 1;
+                case 'h': return _this.padding(date.getHours(), $0.length);
+                case 'm': return _this.padding(date.getMinutes(), $0.length);
+                case 's': return _this.padding(date.getSeconds(), $0.length);
+            }
+        });
+    },
+    padding(s, len) {
+      var len = len - (s + '').length;
+      for (var i = 0; i < len; i++) { s = '0' + s; }
+      return s;
+    }, 
+  },
+};
+</script>
+
+<style scoped>
+.mar_top10{
+    margin-top: 10px
+}
+.eddit {
+    padding: 0.4rem 0.4rem;
+    text-align: right;
+}
+.search-icon {
+    font-size: 0.4rem;
+    display: flex;
+    align-items: center;
+    margin-left: 0.3rem;
+}
+.wrapper {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    height: 100%;
+}
+
+.block {
+    width: 8rem;
+    height: 14rem;
+    background-color: #fff;
+    position: relative;
+}
+.butt {
+    position: absolute;
+    bottom: 0;
+    left: 0;
+}
+.poClass p {
+    padding: 0.4rem 0.2rem;
+    color: #7d7e80;
+}
+.van-image {
+  width: 2rem !important;
+  height: 2rem !important;
+}
+.auste {
+    width: 100%;
+    height: 12rem;
+    overflow: auto;
+}
+.ayss {
+    width: 100%;
+    text-align: center;
+    line-height: 1.2rem;
+    border-bottom: 1px solid #7d7e80;
+}
+.ss {
+    position: absolute;
+    width: 100%;
+    top: 0;
+    left: 0;
+    z-index: 2;
+}
+.top{
+  height: 50px;
+}
+</style>

+ 132 - 37
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/statisticsView/statisticsView.vue

@@ -1,70 +1,162 @@
 <template>
   <div>
-    <van-nav-bar title="数据统计" left-text="返回"  @click-left="back" fixed left-arrow/>
-    <van-date-picker
-      v-model="currentDate"
-      title="选择日期"
-    />
-    <van-tabs v-model="checkStatus" sticky @change="clickLabel" offset-top="1.22667rem">
+    <div class="top">
+      <van-nav-bar title="数据统计" left-text="返回"  @click-left="back" fixed left-arrow/>
+    </div>
+    <div class="bottom" style="position: relative;">
+      <van-tabs v-model="checkStatus" sticky @change="clickLabel">
+        <van-cell-group>
+          <van-field v-model="startDate" label="开始时间" placeholder="请输入开始时间" @click="chooseDate('start')"/>
+        </van-cell-group>
+        <van-cell-group>
+          <van-field v-model="endDate" label="结束时间" placeholder="请输入结束时间" @click="chooseDate('end')"/>
+        </van-cell-group>
         <van-tab v-for="(item, index) in labelList" :title="item.name" :key="index" :name="item.id">
-            <van-cell-group v-for="(itemList, indexList) in groupList" :key="indexList" :style="indexList == 0 ? 'margin: 0.5rem 0;' : 'margin-bottom: 0.5rem'">
-                <van-cell title="提交日期" :value="itemList.happenDate" />
-                <van-cell title="项目名称" :value="itemList.projectName" />
-                <van-cell title="提交人" :value="itemList.enterName" />
-                <van-cell title="研究中心" :value="itemList.centerName" />
-                <van-cell title="阶段" :value="itemList.subDtemplateName" />
-                <van-cell title="理由" :label="itemList.reason" v-if="checkStatus != 0"/>
-            </van-cell-group>
+          <van-cell-group>
+            <van-cell>总计:  工时:{{totalWorkingTime}}分钟   工价:{{totalCost}}元</van-cell>
+          </van-cell-group>
+            <van-collapse  v-model="activeNames">
+              <van-collapse-item v-for="(item,index) in groupList" :key="index" :title="item.createDate+' 工时:'+item.working_time+'分钟 工价:'+item.cost+'元'" :name="index">
+                 <van-cell v-for="(item2,index2) in item.subDataList" :key="index2" @click="goDetail(item2)">
+                  <span>{{item2.creatorName}}:</span>
+                  工时:<span :style="{color:item2.working_time==0?'red':''}">{{item2.working_time}}</span>分钟
+                  工价:<span :style="{color:item2.cost==0?'red':''}">{{item2.cost}}</span>元
+                 </van-cell>
+              </van-collapse-item>
+            </van-collapse>
         </van-tab>
       </van-tabs>
+    </div>
+
+    <van-popup v-model="dateShow" position="bottom" :style="{ height: '30%' }" >
+      <van-datetime-picker
+        v-model="currentDate"
+        type="date"
+        title="选择年月日"
+        @confirm="changeTime" 
+        @cancel="dateShow = false"
+      />
+    </van-popup>
   </div>
 </template>
 
 <script>
 import Vue from "vue";
 import { ImagePreview } from "vant";
-import { DatePicker } from 'vant';
+import { DatetimePicker } from 'vant';
+import { Collapse, CollapseItem ,Cell, CellGroup } from 'vant';
 Vue.use(ImagePreview);
+Vue.use(Collapse);
+Vue.use(CollapseItem);
+Vue.use(Cell);
+Vue.use(CellGroup);
 export default {
   props: {},
   components: {},
   data() {
     return {
       checkStatus: '0',
-      labelList: [{name: '我的统计', id: '0'},{name: '工位统计', id: '1'}],
+      labelList: [],
       groupList: [],
-      currentDate: ['2021', '01', '01'],
+      currentDate: new Date(),
+      dateShow: false,
+      startDate:this.format(new Date(),"yyyy-MM-dd"),
+      endDate:this.format(new Date(),"yyyy-MM-dd"),
+      chooseType:'',
+      totalWorkingTime:0,
+      totalCost:0,
+      activeNames: ['1'],
+      beDeptList: JSON.parse(localStorage.getItem('beDeptList')), // 是否为工长
     };
   },
   computed: {},
   watch: {},
-  created() {},
-  mounted() {},
+  created() {
+    if(this.beDeptList){
+      this.labelList=[{name: '我的统计', id: '0'},{name: '工位统计', id: '1'}]
+    }else{
+      this.labelList=[{name: '我的统计', id: '0'}]
+    }
+  },
+  mounted() {
+    this.getData()
+  },
   methods: {
+    getData(){
+      let postData = {
+        startDate:this.startDate,
+        endDate:this.endDate,
+        checkStatus:this.checkStatus
+      };
+      this.$axios.post("/report/getPersonWorkHoursWagesDetail", postData)
+        .then(res => {
+          this.saving = false;
+            if(res.code == "ok") {
+              this.groupList=res.data.record
+              console.log(this.groupList,'=============')
+              this.totalWorkingTime=res.data.totalWorkingTime
+              this.totalCost=res.data.totalCost
+            } else {
+                this.$toast.fail(res.msg);
+            }
+        }).catch(err=> {this.$toast.clear();});
+    },
+    // 改变时间
+    changeTime(time) {
+      if(this.chooseType=='start'){
+        this.startDate = this.format(new Date(time),"yyyy-MM-dd");  
+      }else{
+        this.endDate = this.format(new Date(time),"yyyy-MM-dd");
+      }
+      this.currentDate = time;
+      this.dateShow = false;
+      this.getData()
+    },
+    chooseDate(type){
+      this.dateShow=true
+      this.chooseType=type
+    },
     back() {
-      this.$router.go(-1);
+      this.$router.push({
+            path:"/index",
+        })
     },
+    goDetail(item){
+      this.$router.push({
+            path:"/statisticsDetail",
+            query:{
+            	startDate:this.startDate,
+            	endDate:this.endDate,
+            	checkStatus:this.checkStatus,
+              userId:item.creatorId
+            }
+        })
+    },
+     // 时间转换
+    format(date, pattern) {
+        pattern = pattern || "yyyy-MM-dd";
+        var _this = this;
+        return pattern.replace(/([yMdhsm])(\1*)/g, function ($0) {
+            switch ($0.charAt(0)) {
+                case 'y': return _this.padding(date.getFullYear(), $0.length);
+                case 'M': return _this.padding(date.getMonth() + 1, $0.length);
+                case 'd': return _this.padding(date.getDate(), $0.length);
+                case 'w': return date.getDay() + 1;
+                case 'h': return _this.padding(date.getHours(), $0.length);
+                case 'm': return _this.padding(date.getMinutes(), $0.length);
+                case 's': return _this.padding(date.getSeconds(), $0.length);
+            }
+        });
+    },
+    padding(s, len) {
+      var len = len - (s + '').length;
+      for (var i = 0; i < len; i++) { s = '0' + s; }
+      return s;
+    },   
     // 点击标签触发
     clickLabel() {
         this.getData()
     },
-    // 获取数据
-    getData() {
-        // this.$toast.loading({
-        //   message: '数据加载中...',
-        //   forbidClick: true,
-        // });
-        // this.$axios.post("/data-item-detail/getAllDataItemDetail", {
-
-        // })
-        // .then(res => {
-        //     if(res.code == "ok") {
-
-        //     } else {
-        //         this.$toast.fail('获取失败');
-        //     }
-        // }).catch(err=> {this.$toast.clear();});
-    },
   },
 };
 </script>
@@ -124,4 +216,7 @@ export default {
     left: 0;
     z-index: 2;
 }
+.top{
+  height: 50px;
+}
 </style>

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/orderInsert.vue

@@ -57,7 +57,7 @@
         </el-table-column>
         <el-table-column prop="startDate" label="开工时间" width="180"></el-table-column>
         <el-table-column prop="endDate" label="完工时间" width="180"></el-table-column>
-        <el-table-column label="编辑">
+        <el-table-column label="操作" :fixed="'right'">
           <template slot-scope="scope">
             <div @click="editPlan(scope.row)" class="colorText">编辑</div>
           </template>

+ 4 - 4
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/planComponent.vue

@@ -122,10 +122,10 @@
           <!-- <el-form-item label="进度"  :style="this.titleName==='编辑今日计划'?'':'width: 100%'" prop="progress">
             <el-input v-model="todayPlanForm.progress" maxlength="20"></el-input>
           </el-form-item> -->
-            <el-form-item label="车辆序号" style="width: 100%" prop="steelStampNumberStart">
-            <el-input-number class="w45" v-model="todayPlanForm.chicleNumStart" maxlength="20"></el-input-number>
-            {{ "-" }}
-            <el-input-number class="w45" v-model="todayPlanForm.chicleNumEnd" maxlength="20"></el-input-number>
+          <el-form-item label="车辆序号" style="width: 100%" prop="steelStampNumberStart">
+          <el-input-number class="w45" v-model="todayPlanForm.chicleNumStart" maxlength="20"></el-input-number>
+          {{ "-" }}
+          <el-input-number class="w45" v-model="todayPlanForm.chicleNumEnd" maxlength="20"></el-input-number>
           </el-form-item>
           <el-form-item label="数量" prop="num">
             <el-input v-model="todayPlanForm.num" maxlength="10" type="number"></el-input>

+ 90 - 35
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/statistic/index.vue

@@ -63,18 +63,26 @@
         <div class="staff" ref="tabless" :style="'width:'+(windowWidth - 430)+'px'">
             <!-- 人员工时工价表 -->
             <el-table v-if="ins == 0"  key="19" border :data="personWorkHoursWagesList" highlight-current-row v-loading="listLoading" :height="+tableHeight - 1" style="width: 100%;">
-                <el-table-column align="center" prop="departmentCascade" label="部门名称" min-width="150"></el-table-column>
+                <el-table-column align="center" prop="departmentCascade" label="部门名称" min-width="150">
+                  <template slot-scope="scope">
+                    {{scope.row.departmentCascade}}
+                  </template>
+                </el-table-column>
                 <el-table-column align="center" prop="name" label="人员" min-width="250"></el-table-column>
                 <el-table-column v-for="(item, index) in personWorkHoursWagesHead" :key="index" :label="item" align="center" min-width="250">
                     <template slot-scope="scope">
-                        <div v-for="(items, indexs) in scope.row.personWorkHoursWages" :key="indexs" @click="showReportDetail(scope.row)" class="colorText">
+                        <div v-for="(items, indexs) in scope.row.personWorkHoursWages" :key="indexs" @click="showReportDetail(scope.row,item)" class="colorText">
                             <div v-if="items.crateDate == item">
                                 {{items.workTime}}分钟  {{items.cost}}元
                             </div>
                         </div>
                     </template>
                 </el-table-column>
-                <el-table-column align="center" prop="totalResult" label="合计" min-width="250"></el-table-column>
+                <el-table-column align="center" prop="totalResult" label="合计" min-width="250">
+                   <template slot-scope="scope">
+                    {{scope.row.totalResult}}
+                  </template>
+                </el-table-column>
             </el-table>
 
             <!-- 计划实时进度表 -->
@@ -86,10 +94,14 @@
                 </el-table-column>
                 <el-table-column align="center" prop="procedureName" label="工序" min-width="250"></el-table-column>
                 <el-table-column align="center" prop="userName" label="人员" min-width="150"></el-table-column>
-                <el-table-column align="center" prop="planWorkTime" label="计划工时" min-width="250"></el-table-column>
-                <el-table-column align="center" prop="nowWorkTime" label="当前工时" min-width="250"></el-table-column>
+                <el-table-column align="center" prop="planWorkTime" label="计划工时" min-width="250">
+                  <template slot-scope="scope" v-if="scope.row.planWorkTime">{{scope.row.planWorkTime}}分钟</template>
+                </el-table-column>
+                <el-table-column align="center" prop="nowWorkTime" label="当前工时" min-width="250">
+                  <template slot-scope="scope" v-if="scope.row.nowWorkTime">{{scope.row.nowWorkTime}}分钟</template>
+                </el-table-column>
                 <el-table-column align="center" prop="progress" label="进度" min-width="250">
-                  <template slot-scope="scope">
+                  <template slot-scope="scope" v-if="scope.row.progress">
                     {{scope.row.progress}}%
                   </template>
                 </el-table-column>
@@ -124,7 +136,7 @@
   </div>
   </div>
 
-  <el-dialog :title="'详情'" :visible.sync="reportDetailDialog" width="800px">
+  <el-dialog :title="'详情'" :visible.sync="reportDetailDialog" width="1480px">
           <div>
             日期:<el-select v-model="simpleDateChoose" placeholder="请选择" @change="getPersonWorkHoursWagesDetail()">
                 <el-option
@@ -136,10 +148,9 @@
                 </el-option>
               </el-select>
           </div>
-          <div>
+          <!-- <div>
             总计:<span>{{this.totalWorkingTime}}分钟 {{this.totalCost}}元</span>
           </div>
-          <!-- 循环盒子 -->
           <div v-for="(item,index) in personWorkHoursWagesDetail" :key="index" :label="item">
               <div>{{item.productName}}</div>
               <div>{{item.planStartDate}}-{{item.planEndDate}}</div>
@@ -166,6 +177,35 @@
                   </div>
                 </div>
               </div>
+          </div> -->
+          <div>
+            <el-table
+              :data="personWorkHoursWagesDetail"
+              style="width: 100%">
+              <el-table-column
+                prop="date"
+                label="计划(开始-结束日期)"
+                width="180">
+                <template slot-scope="scope">
+                  {{scope.row.planStartDate}}-{{scope.row.planEndDate}}
+                </template>
+              </el-table-column>
+              <el-table-column prop="productName" label="产品名称" width="180"></el-table-column>
+              <el-table-column prop="procedureName" label="工序名称" width="180"></el-table-column>
+              <el-table-column prop="progress" label="进度" width="180">
+                <template slot-scope="scope">
+                  {{scope.row.progress?scope.row.progress:0}}%
+                </template>
+              </el-table-column>
+              <el-table-column prop="cost" label="工钱" width="180"></el-table-column>
+              <el-table-column prop="checkType" label="质检方式" width="180"></el-table-column>
+              <el-table-column prop="checkerName" label="质检人" width="180"></el-table-column>
+              <el-table-column prop="working_time" label="工作时长" width="180">
+                <template slot-scope="scope">
+                  {{scope.row.working_time}}分钟
+                </template>
+              </el-table-column>
+            </el-table>
           </div>
   </el-dialog>
 
@@ -186,16 +226,21 @@
           <el-form-item label="项目代码" style="width: 100%" prop="projectCode">
             <el-input v-model="planForm.projectCode" maxlength="50" readonly></el-input>
           </el-form-item>
-          <el-form-item label="钢印号" style="width: 100%" prop="steelStampNumberStart">
-            <el-input class="w45" v-model="planForm.steelStampNumberStart" maxlength="20"></el-input>
+          <el-form-item label="钢印号" v-for="(item,index) in planForm.steelStampNumberList" :key="index" style="width: 100%" prop="steelStampNumberStart">
+            <el-input class="w45" v-model="item.steelStampNumberStart" maxlength="20"></el-input>
             {{ "-" }}
-            <el-input class="w45" v-model="planForm.steelStampNumberEnd" maxlength="20"></el-input>
+            <el-input class="w45" v-model="item.steelStampNumberEnd" maxlength="20"></el-input>
           </el-form-item>
           <el-form-item label="计划总工价" v-if="this.titleName==='编辑今日计划'"  prop="planTotalWages">
             <el-input v-model="planForm.planTotalWages" type="number"></el-input>
           </el-form-item>
-          <el-form-item label="进度"  :style="this.titleName==='编辑今日计划'?'':'width: 100%'" prop="progress">
+          <!-- <el-form-item label="进度"  :style="this.titleName==='编辑今日计划'?'':'width: 100%'" prop="progress">
             <el-input v-model="planForm.progress" maxlength="20"></el-input>
+          </el-form-item> -->
+          <el-form-item label="车辆序号" style="width: 100%" prop="steelStampNumberStart">
+          <el-input-number class="w45" v-model="planForm.chicleNumStart" maxlength="20"></el-input-number>
+          {{ "-" }}
+          <el-input-number class="w45" v-model="planForm.chicleNumEnd" maxlength="20"></el-input-number>
           </el-form-item>
           <el-form-item label="数量" prop="num">
             <el-input v-model="planForm.num" maxlength="10" type="number"></el-input>
@@ -376,7 +421,16 @@ export default {
         endDate: "",
         describtion: "",
         versionNumber: "",
-        planTotalWages:0
+        planTotalWages:0,
+        chicleNumStart:'',
+        chicleNumEnd:'',
+        steelStampNumberList:[
+          {
+            id:null,
+            steelStampNumberStart:'',
+            steelStampNumberEnd:''
+          }
+        ],
       },
 
       orderInsertPlanForm : {
@@ -497,11 +551,11 @@ export default {
       this.taskName=item.taskName
       this.getPlanDetail(item);
     },
-    showReportDetail(item){
+    showReportDetail(row,item){
       console.log(item)
       this.reportDetailDialog=true
-      this.detailUserId=item.id
-      this.getPersonWorkHoursWagesDetail()
+      this.detailUserId=row.id
+      this.getPersonWorkHoursWagesDetail(item)
     },
     authorityToJudge() {
     //   if(this.permissions.reportProject || this.permissions.reportAllProject) {this.ssl(0);this.defaultActive = '1-1';return} else
@@ -637,28 +691,29 @@ export default {
         });
     },
     //点击详情(人员工时工价表)
-    getPersonWorkHoursWagesDetail(){
-        this.http.post( "/report/getPersonWorkHoursWagesDetail", {
-            date: this.simpleDateChoose.substring(0,4)+"-"+this.simpleDateChoose.substring(4,6)+"-"+this.simpleDateChoose.substring(6,this.simpleDateChoose.length),
-            userId:this.detailUserId
-        },
-        res => {
-          if (res.code == "ok") {
-            this.personWorkHoursWagesDetail=res.data.record
-            this.totalCost=res.data.totalCost
-            this.totalWorkingTime=res.data.totalWorkingTime
-          } else {
-            this.$message({
-              message: res.msg,
-              type: "error"
-            });
-          }
-        },error => {
+    getPersonWorkHoursWagesDetail(item){
+      this.simpleDateChoose=item
+      this.http.post( "/report/getPersonWorkHoursWagesDetail", {
+          date: this.simpleDateChoose.substring(0,4)+"-"+this.simpleDateChoose.substring(4,6)+"-"+this.simpleDateChoose.substring(6,this.simpleDateChoose.length),
+          userId:this.detailUserId
+      },
+      res => {
+        if (res.code == "ok") {
+          this.personWorkHoursWagesDetail=res.data.record
+          this.totalCost=res.data.totalCost
+          this.totalWorkingTime=res.data.totalWorkingTime
+        } else {
           this.$message({
-            message: error,
+            message: res.msg,
             type: "error"
           });
+        }
+      },error => {
+        this.$message({
+          message: error,
+          type: "error"
         });
+      });
     },
     //计划实际工时表
     getPlanRealTimeProgressList(){