Selaa lähdekoodia

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

seyason 1 vuosi sitten
vanhempi
commit
eb400554a1
22 muutettua tiedostoa jossa 369 lisäystä ja 124 poistoa
  1. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  2. 15 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/PlanController.java
  3. 2 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/Plan.java
  4. 8 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/PlanProcedureTotal.java
  5. 3 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/ProdProcedureTeam.java
  6. 1 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/mapper/UserMapper.java
  7. 7 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/PlanService.java
  8. 69 10
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanServiceImpl.java
  9. 2 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java
  10. 1 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  11. 35 68
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/task/TimingTask.java
  12. 1 13
      fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/UserMapper.xml
  13. 1 1
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/planView/component/planComponent.vue
  14. 177 7
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/planView/todayPlan/distribution.vue
  15. 1 1
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/planView/todayPlan/todayPlan.vue
  16. 1 1
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/planView/tomorrowPlan/tomorrowPlan.vue
  17. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop/favicon.ico
  18. 3 2
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/orderInsert.vue
  19. 27 9
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/planComponent.vue
  20. 11 8
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/planComponentDetil.vue
  21. 1 1
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/today.vue
  22. 1 1
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/tomorrow.vue

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -17,6 +17,7 @@ import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.util.CellRangeAddressList;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -492,6 +493,7 @@ public class ProjectController {
     }
 
     @RequestMapping("/importData")
+    @Transactional(rollbackFor = Exception.class)
     public HttpRespMsg importData(String userId, MultipartFile file,@RequestParam(defaultValue = "0") Integer key,HttpServletRequest request) {
         return projectService.importData(userId, file,key, request);
     }

+ 15 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/PlanController.java

@@ -3,6 +3,7 @@ package com.management.platform.controller;
 
 import com.management.platform.entity.Plan;
 import com.management.platform.entity.PlanProcedureTotal;
+import com.management.platform.entity.ProdProcedureTeam;
 import com.management.platform.service.PlanService;
 import com.management.platform.util.HttpRespMsg;
 import org.apache.ibatis.annotations.Param;
@@ -84,6 +85,20 @@ public class PlanController {
     public HttpRespMsg teamAllocation(PlanProcedureTotal planProcedureTotal, String teamIds,Integer planType) throws Exception {
         return planService.teamAllocation(planProcedureTotal,teamIds,planType);
     }
+    /*换人操作*/
+    @RequestMapping("/changePeople")
+    public HttpRespMsg changePeople(ProdProcedureTeam prodProcedureTeam,String newPeopleId){
+        return planService.changePeople(prodProcedureTeam,newPeopleId);
+    }
+
+    @RequestMapping("/deletePeople")
+    public HttpRespMsg deletePeople(Integer id){
+        return planService.deletePeople(id);
+    }
 
+    @RequestMapping("/receivePlan")
+    public HttpRespMsg receivePlan(String ids){
+        return planService.receivePlan(ids);
+    }
 }
 

+ 2 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/Plan.java

@@ -219,6 +219,8 @@ public class Plan extends Model<Plan> {
      * 创建时间
      */
     @TableField("create_time")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat( pattern="yyyy-MM-dd HH:mm:ss")
     private LocalDateTime createTime;
 
     /**

+ 8 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/PlanProcedureTotal.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
+import java.util.List;
+
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -63,6 +65,12 @@ public class PlanProcedureTotal extends Model<PlanProcedureTotal> {
     @TableField(exist = false)
     private Integer totalProgress;
 
+    @TableField(exist = false)
+    private List<ProdProcedureTeam> prodProcedureTeamList;
+
+    @TableField(exist = false)
+    private boolean canReceive;
+
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 3 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/ProdProcedureTeam.java

@@ -80,6 +80,9 @@ public class ProdProcedureTeam extends Model<ProdProcedureTeam> {
     @TableField("status")
     private Integer status;
 
+    @TableField(exist = false)
+    private User user;
+
 
     @Override
     protected Serializable pkVal() {

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

@@ -28,7 +28,7 @@ public interface UserMapper extends BaseMapper<User> {
                                                       @Param("companyId") Integer companyId,
                                                       @Param("departmentIds") List departmentIds, String keyword, Integer status, @Param("roleId") Integer roleId);
 
-    List<Map<String, Object>> getPushUserList(@Param("companyId") Integer companyId,Integer alertType, String date);
+    List<Map<String, Object>> getPushUserList(@Param("companyId") Integer companyId, String date);
 
     List<Map<String, Object>> getPushDingdingUserList(@Param("alertTime") String alertTime, String date);
 

+ 7 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/PlanService.java

@@ -3,6 +3,7 @@ package com.management.platform.service;
 import com.management.platform.entity.Plan;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.entity.PlanProcedureTotal;
+import com.management.platform.entity.ProdProcedureTeam;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -35,4 +36,10 @@ public interface PlanService extends IService<Plan> {
     HttpRespMsg hasSetDeptDetail();
 
     HttpRespMsg teamAllocation(PlanProcedureTotal planProcedureTotal, String teamIds,Integer planType) throws Exception;
+
+    HttpRespMsg changePeople(ProdProcedureTeam prodProcedureTeam, String newPeopleId);
+
+    HttpRespMsg deletePeople(Integer id);
+
+    HttpRespMsg receivePlan(String ids);
 }

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

@@ -20,6 +20,7 @@ import org.apache.poi.xssf.usermodel.XSSFCell;
 import org.apache.poi.xssf.usermodel.XSSFRow;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -151,7 +152,7 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
         if(!StringUtils.isEmpty(steelStampNumber)){
             queryWrapper.apply("'"+steelStampNumber+"'"+" between steel_stamp_number_start AND steel_stamp_number_end");
         }
-        queryWrapper.orderByDesc("start_date");
+        queryWrapper.orderByDesc("start_date").orderByDesc("create_time");
         IPage<Plan> planIPage = planMapper.selectPage(new Page<>(pageIndex, pageSize), queryWrapper);
         List<Plan> records = planIPage.getRecords();
         List<Integer> ids = records.stream().map(Plan::getProductId).distinct().collect(Collectors.toList());
@@ -792,6 +793,51 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
         return httpRespMsg;
     }
 
+    @Override
+    public HttpRespMsg receivePlan(String ids) {
+        HttpRespMsg msg=new HttpRespMsg();
+        if(StringUtils.isEmpty(ids)){
+            return msg;
+        }
+        List<String> idList =Arrays.asList(ids.split(","));
+        List<ProdProcedureTeam> procedureTeams = prodProcedureTeamService.list(new QueryWrapper<ProdProcedureTeam>().in("id", idList));
+        procedureTeams.forEach(pl->{
+            pl.setStatus(1);
+        });
+        if(!prodProcedureTeamService.updateBatchById(procedureTeams)){
+            msg.setError("验证失败");
+        }
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg deletePeople(Integer id) {
+        HttpRespMsg msg=new HttpRespMsg();
+        ProdProcedureTeam prodProcedureTeam = prodProcedureTeamService.getById(id);
+        if(prodProcedureTeam.getStatus()!=0){
+            msg.setError("非待接收状态无法删除");
+            return msg;
+        }
+        if(!prodProcedureTeamService.removeById(prodProcedureTeam)){
+            msg.setError("验证失败");
+        }
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg changePeople(ProdProcedureTeam prodProcedureTeam, String newPeopleId) {
+        HttpRespMsg msg=new HttpRespMsg();
+        ProdProcedureTeam p=new ProdProcedureTeam();
+        BeanUtils.copyProperties(prodProcedureTeam,p);
+        p.setId(null);
+        p.setUserId(newPeopleId);
+        p.setStatus(0);
+        if(!prodProcedureTeamService.save(p)){
+            msg.setError("验证失败");
+        }
+        return msg;
+    }
+
     @Override
     public HttpRespMsg teamAllocation(PlanProcedureTotal planProcedureTotal,String teamIds,Integer planType) throws Exception {
         HttpRespMsg msg=new HttpRespMsg();
@@ -813,20 +859,21 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
             List<ProdProcedureTeam> procedureTeamList = prodProcedureTeamService.list(new QueryWrapper<ProdProcedureTeam>().eq("plan_procedure_id",planProcedureTotal.getId()));
             List<User> userList = userMapper.selectBatchIds(Arrays.asList(team));
             //处理人员
-            procedureTeamList.stream().forEach(pt->{
-                if(!Arrays.asList(team).contains(pt.getUserId())){
-                    Integer cut = reportMapper.selectCount(new QueryWrapper<Report>().eq("user_procedure_team_id", pt.getId()));
-                    if(cut<1){
-                        prodProcedureTeamService.removeById(pt.getId());
-                    }
-                }
-            });
+//            procedureTeamList.stream().forEach(pt->{
+//                if(!Arrays.asList(team).contains(pt.getUserId())){
+//                    Integer cut = reportMapper.selectCount(new QueryWrapper<Report>().eq("user_procedure_team_id", pt.getId()));
+//                    if(cut<1){
+//                        prodProcedureTeamService.removeById(pt.getId());
+//                    }
+//                }
+//            });
             for (int i = 0; i < team.length; i++) {
                 ProdProcedureTeam prodProcedureTeam=new ProdProcedureTeam();
                 prodProcedureTeam.setCompanyId(companyId);
                 prodProcedureTeam.setPlanProcedureId(planProcedureTotal.getId());
                 prodProcedureTeam.setUserId(team[i]);
                 int finalI = i;
+                //已存在的人员更新处理
                 Optional<ProdProcedureTeam> first = procedureTeamList.stream().filter(pl -> pl.getUserId().equals(team[finalI])).findFirst();
                 if(first.isPresent()){
                     prodProcedureTeam.setId(first.get().getId());
@@ -874,6 +921,7 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
         HttpRespMsg msg=new HttpRespMsg();
         Plan plan = planMapper.selectOne(new QueryWrapper<Plan>().eq("id", id));
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        String userId = request.getHeader("token");
         if(plan!=null){
             switch (type){
                 case 0:
@@ -889,7 +937,18 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
                             ps.setProdProcedure(first.get());
                         }
                         if(procedureTeams.size()>0){
-                            ps.setTeamIds(procedureTeams.stream().filter(pt->pt.getPlanProcedureId().equals(ps.getId())).map(ProdProcedureTeam::getUserId).distinct().collect(Collectors.joining(",")));
+                            List<ProdProcedureTeam> procedureTeamList = procedureTeams.stream().filter(pt -> pt.getPlanProcedureId().equals(ps.getId())).collect(Collectors.toList());
+                            ps.setTeamIds(procedureTeamList.stream().map(ProdProcedureTeam::getUserId).distinct().collect(Collectors.joining(",")));
+                            procedureTeamList.forEach(pt->{
+                                Optional<User> user = userList.stream().filter(ul -> ul.getId().equals(pt.getUserId())).findFirst();
+                                if(user.isPresent()){
+                                    pt.setUser(user.get());
+                                }
+                            });
+                            ps.setProdProcedureTeamList(procedureTeamList);
+                            if(procedureTeamList.stream().anyMatch(pl->pl.getStatus()==0&&pl.getUserId().equals(userId))){
+                                ps.setCanReceive(true);
+                            }
                             if(!StringUtils.isEmpty(ps.getTeamIds())){
                                 String userNames = userList.stream().filter(ul -> Arrays.asList(ps.getTeamIds().split(",")).contains(ul.getId())).collect(Collectors.toList())
                                         .stream().map(User::getName).collect(Collectors.joining(","));

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

@@ -84,7 +84,8 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
             queryWrapper.like("code",code);
         }
         User user = userMapper.selectById(request.getHeader("Token"));
-        queryWrapper.eq("company_id",user.getCompanyId());
+        queryWrapper.eq("company_id",user.getCompanyId()).orderByDesc("id");
+
         IPage<Product> iPage;
         if(pageIndex!=null && pageSize!=null){
             iPage= productMapper.selectPage(new Page<>(pageIndex, pageSize),

+ 1 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -2023,6 +2023,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             //生成Excel文件
             //String fileUrlSuffix = "员工列表" + System.currentTimeMillis() + ".xls";
             String fileUrlSuffix = MessageUtils.message("excel.peopleList") + System.currentTimeMillis() + ".xls";
+
             FileOutputStream fos = new FileOutputStream(path + fileUrlSuffix);
             workbook.write(fos);
             fos.flush();

+ 35 - 68
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/task/TimingTask.java

@@ -1,5 +1,6 @@
 package com.management.platform.task;
 
+import com.alibaba.excel.util.DateUtils;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -83,34 +84,13 @@ public class TimingTask {
     @Resource
     private UserMapper userMapper;
     @Resource
-    private DepartmentMapper departmentMapper;
-    @Resource
-    private ReportMapper reportMapper;
-    @Resource
-    private TimeAutoExcludeMapper timeAutoExcludeMapper;
-    @Resource
     private WxCorpInfoService wxCorpInfoService;
     @Resource
     private WxCorpInfoMapper wxCorpInfoMapper;
-    @Resource
-    private ReportLogMapper reportLogMapper;
-    @Resource
-    private OperationRecordService operationRecordService;
     @Value(value = "${upload.path}")
     private String path;
-
-    @Resource
-    private SysConfigMapper sysConfigMapper;
-    @Resource
-    private ThirdPartyInterfaceMapper thirdPartyInterfaceMapper;
-    @Resource
-    private ThirdPartyInterfaceService thirdPartyInterfaceService;
     @Resource
     private TimeTypeService timeTypeService;
-    @Resource
-    private SysRoleMapper sysRoleMapper;
-    @Resource
-    private UserService userService;
 
     private static final List<Integer> VALID_TOKEN_CHARS = new ArrayList<>();
     static {
@@ -187,54 +167,41 @@ public class TimingTask {
         DateTimeFormatter dt = DateTimeFormatter.ofPattern("HH:mm");
         String str = dt.format(now);
         String date = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(localDate);
-        List<TimeType> typeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().isNotNull("alert_time")
-                .ge("alert_time", str));
-        typeList.forEach(t->{
-            if (str.equals(t.getAlertTime())) {
-                //节假日是否提醒
-                Boolean workDay = timeTypeService.isWorkDay(t.getCompanyId(), localDate);
-                if (!workDay){
-                    return;
-                }
-                //发送推送提醒
-                Company company = companyMapper.selectById(t.getCompanyId());
-                //过期公司不提醒
-                if(company.getExpirationDate().isBefore(LocalDateTime.now())){
-                    return;
-                }
-                //开通了OA功能,有请假模块的,需要把当前请假的排除掉
-                List<Map<String, Object>> userList = null;
-                if (company.getPackageOa() == 1) {
-                    userList = userMapper.getPushUserList(t.getCompanyId(),t.getAlertType(), date);
-                } else {
-                    userList = userMapper.getPushUserList(t.getCompanyId(),t.getAlertType(), null);
-                }
-
-                List<WxCorpInfo> cpList = wxCorpInfoMapper.selectList(new QueryWrapper<WxCorpInfo>().eq("company_id", t.getCompanyId()));
-                userList.forEach(u->{
-                    if (u.get("corpwxUserid") != null){
-                        //推送到企业微信
-                        String corpUid = (String) u.get("corpwxUserid");
-                        JSONObject json=new JSONObject();
-                        JSONArray dataJson=new JSONArray();
-                        JSONObject jsonObj=new JSONObject();
-                        jsonObj.put("key", "提示");
-                        jsonObj.put("value", StringUtils.isEmpty(t.getAlertMsg())?"":t.getAlertMsg());
-                        dataJson.add(jsonObj);
-                        if(isPrivateDeploy){
-                            json.put("content",StringUtils.isEmpty(t.getAlertMsg())?"":t.getAlertMsg()+"\\n<a href=\\\"https://open.weixin.qq.com/connect/oauth2/authorize?appid="+suitId+"&redirect_uri="+pcUrl+"/api/corpInsideWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect\\\">去填写</a>");
-                        }else {
-                            json.put("template_id","tty9TkCAAAYoevY-40ciWD5lDncDfR5w");
-                            json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
-                            json.put("content_item",dataJson);
-                        }
-                        if (cpList.size() > 0) {
-                            wxCorpInfoService.sendWXCorpTemplateMsg(cpList.get(0), corpUid, json);
-                        }
-                    }
-                });
+        List<WxCorpInfo> wxCorpInfoList = wxCorpInfoMapper.selectList(null);
+        for (WxCorpInfo wxCorpInfo : wxCorpInfoList) {
+            //节假日是否提醒
+            boolean workDay = WorkDayCalculateUtils.isWorkDay(localDate);
+            if (!workDay){
+                return;
+            }
+            //发送推送提醒
+            Company company = companyMapper.selectById(wxCorpInfo.getCompanyId());
+            //过期公司不提醒
+            if(company.getExpirationDate().isBefore(LocalDateTime.now())){
+                return;
             }
-        });
+            List<Map<String, Object>> userList = userMapper.getPushUserList(wxCorpInfo.getCompanyId(), date);
+            userList.forEach(u->{
+                if (u.get("corpwxUserid") != null){
+                    //推送到企业微信
+                    String corpUid = (String) u.get("corpwxUserid");
+                    JSONObject json=new JSONObject();
+                    JSONArray dataJson=new JSONArray();
+                    JSONObject jsonObj=new JSONObject();
+                    jsonObj.put("key", "提示");
+                    jsonObj.put("value", "请尽快填写昨日的报工");
+                    dataJson.add(jsonObj);
+                    if(isPrivateDeploy){
+                        json.put("content","请尽快填写昨日的报工"+"\\n<a href=\\\"https://open.weixin.qq.com/connect/oauth2/authorize?appid="+suitId+"&redirect_uri="+pcUrl+"/api/corpInsideWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect\\\">去填写</a>");
+                    }else {
+                        json.put("template_id","tty9TkCAAAYoevY-40ciWD5lDncDfR5w");
+                        json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
+                        json.put("content_item",dataJson);
+                    }
+                    wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo, corpUid, json);
+                }
+            });
+        }
     }
 
 }

+ 1 - 13
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/UserMapper.xml

@@ -123,19 +123,7 @@
         WHERE a.company_id = #{companyId}
         AND (a.wx_openid IS NOT NULL or corpwx_userid is not null)
         AND a.is_active = 1
-        AND a.report_status =0
-        <choose>
-            <when test="alertType!=null and alertType==1">
-                AND NOT EXISTS(SELECT 1 FROM report WHERE report.`creator_id` = a.id AND report.`create_date` = DATE_FORMAT(date_sub(NOW(),interval 1 day), '%Y-%m-%d'))
-            </when>
-            <otherwise>
-                AND NOT EXISTS(SELECT 1 FROM report WHERE report.`creator_id` = a.id AND report.`create_date` = DATE_FORMAT(NOW(), '%Y-%m-%d'))
-            </otherwise>
-        </choose>
-        <if test="date != null">
-            and not exists (select 1 from leave_sheet where owner_id = a.id and start_date &lt;= #{date} and end_date &gt;= #{date} and leave_sheet.status = 0)
-        </if>
-
+        AND NOT EXISTS(SELECT 1 FROM report WHERE report.`creator_id` = a.id AND report.`create_date` = DATE_FORMAT(NOW(), '%Y-%m-%d'))
     </select>
 
 

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/planView/component/planComponent.vue

@@ -4,7 +4,7 @@
       <div class="planComponent_box" v-for="item, index in productList" :key="index">
         <div class="planComponent_Item">
           <div class="planComponent_ItemTop">
-            <div>{{ item.productName }}</div>
+            <div>{{ item.productName}}</div>
             <div>{{ item.productSchedulingNum }}</div>
             <div>
               <p>{{ item.startDate }}-{{ item.endDate }}</p><span @click="workShowHide(index)">{{ item.flg ? paiArr[0] : paiArr[1] }}</span>

+ 177 - 7
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/planView/todayPlan/distribution.vue

@@ -1,4 +1,5 @@
 <template>
+<div>
   <div class="distribution">
     <van-nav-bar :title="titleText" left-text="返回" :right-text="!todayAndTomorrow ? '下发计划' : ''" @click-left="back" @click-right="placeAnOrder" fixed left-arrow/>
     <div class="distribution_header">
@@ -9,14 +10,11 @@
     <div class="distribution_con contentRoll">
       <div class="distribution_box" v-for="item,index in distributionList" :key="index">
         <div class="distribution_ItemBom">
+          <van-checkbox v-model="item.prodProcedure.isSelected"  @click="itemChecked" shape="square">
+          </van-checkbox>
           <div class="PlanItem">
             <span>{{ item.prodProcedure.name }}</span>
           </div>
-          <div class="PlanItem" v-show="todayAndTomorrow">
-            <div>组员:</div>
-            <span class="" v-if="item.teamNames" @click="distributionProp(item,index)">{{ item.teamNames }} <van-icon name="edit" color="#1989fa" /> </span>
-            <span style="color: #1989fa;" v-if="!item.teamNames && beDeptList" @click="distributionProp(item,index)">分配</span>
-          </div>
           <div class="PlanItem">
             <div>单件工价:</div><span class="textBeyondHiding">{{ item.prodProcedure.workingTime }}</span>
           </div>
@@ -37,25 +35,68 @@
               {{ item.prodProcedure.checkType == 0 ? '自检' : item.prodProcedure.checkType == 1 ? '互检' : '专检' }}
             </span>
           </div>
+           <div class="PlanItem" v-show="todayAndTomorrow" style="width:100%">
+            <div>组员:</div>
+            <span class="" v-if="item.teamNames">{{ item.teamNames }}</span>
+            <span style="color: #1989fa;" v-if="!item.teamNames && beDeptList" @click="distributionProp(item,index)">分配</span>
+            <div>
+              <span style="color: #1989fa;" v-if="item.prodProcedureTeamList" @click="workShowHide(index)">{{ item.flg ? paiArr[0] : paiArr[1] }}</span>
+            </div>
+          </div>
+          <div>
+              <collapse>
+                <div v-if="item.flg">
+                    <div>
+                      <div class="distribution_box" v-for="second_item,index in item.prodProcedureTeamList " :key="index">
+                        <div class="distribution_ItemBom">
+                          <div class="PlanItem">
+                            <span>{{ second_item.user.name }}</span>
+                            <span>{{ second_item.status==0?"待接收":second_item.status==1?"进行中":second_item.status==2?"已完工":"已终止"}}</span>
+                            <span class="" v-if="second_item.status==3" @click="changePeople(second_item)"  style="color: #1989fa;">换人</span>
+                            <span class="" v-if="second_item.status==0" @click="deletePeople(second_item.id)"  style="color: #1989fa;">删除</span>
+                          </div>
+                        </div>
+                      </div>
+                      <div class="PlanItem">
+                            <span class="" v-if="item.teamNames" @click="distributionProp(item,index)"  style="color: #1989fa;">新增</span>
+                          </div>
+                    </div>
+                </div>
+              </collapse>
+          </div>
         </div>
       </div>
     </div>
+    
     <!-- 弹出层选人 -->
     <van-popup v-model="popupShow" round position="bottom" :style="{ height: '80%',background: '#F4F4F4' }" >
       <ChooseSomeone ref="ChooseSomeone" :groupView="2" :groupViewBack="true" :peopleList="peopleList" @ChooseSomeoneChanhe="chooseSomeoneChanhe" :peopleListId="peopleListId"></ChooseSomeone>
     </van-popup>
   </div>
+<div class="formBatch">
+        <van-checkbox v-model="isAllChecked" :disabled="distributionList.length == 0" @click="allChecked" shape="square" style="padding-left:3vw"></van-checkbox>
+        <div style="padding:1vh 2vw">
+        <van-button @click="batchReceive()" :disabled="!isCanAgree || distributionList.length == 0" type="info" size="small">批量接收</van-button>
+        <!-- <van-button @click="batchAgree(false)" :disabled="!isCanAgree || distributionList.length == 0" type="danger" size="small" style="margin-left:2vw">批量驳回</van-button> -->
+        </div>
+    </div>
+</div>
 </template>
 
 <script>
 import ChooseSomeone from '../../../components/chooseSomeone.vue'
+import collapse from '../../../assets/collapse.js'
+import { CellGroup } from 'vant';
 export default {
   props: {},
   components: {
+    collapse,
     ChooseSomeone
   },
   data() {
     return {
+      isAllChecked:  false,
+      activeNames: ['1'],
       beDeptList: JSON.parse(localStorage.getItem('beDeptList')), // 是否为工长
       distributionList: [],
       distributionIndex: null,
@@ -70,13 +111,16 @@ export default {
 
       dates: '',
       productSchedulingNum: '',
-      productName: ''
+      productName: '',
+      isCanAgree:false,
+      user: JSON.parse(localStorage.userInfo)
     };
   },
   computed: {},
   watch: {},
   created() {},
   mounted() {
+    this.paiArr = ['收起', '展开'],
     this.id = this.$route.query.id
     this.type = this.$route.query.type
     this.departmentId = this.$route.query.departmentId
@@ -94,12 +138,102 @@ export default {
     this.getPeople()
   },
   methods: {
+    // 批量操作
+    allChecked(){
+        if(this.isAllChecked){
+            for(let i in this.distributionList){
+                this.distributionList[i].prodProcedure.isSelected = true
+                console.log('===============');
+            }
+            this.isCanAgree = true
+        }else{
+            for(let i in this.distributionList){
+                this.distributionList[i].prodProcedure.isSelected = false
+            }
+            this.isCanAgree = false
+        }
+        this.$forceUpdate();
+    },
+    itemChecked(){
+        let isall = true
+        let iscan = false
+        for(let i in this.distributionList){
+            if(!this.distributionList[i].prodProcedure.isSelected){
+                isall = false
+            }else {
+                iscan = true
+            }
+        }
+        this.isAllChecked = isall
+        this.isCanAgree = iscan
+    },
+    batchReceive(bol){
+        let ids = ''
+        console.log(this.user)
+        let resArr=  this.distributionList.map(item=>{
+          if(item.prodProcedure.isSelected){
+            if(item.prodProcedureTeamList.filter(i=>i.userId==this.user.id).length>0){
+               return item.prodProcedureTeamList.filter(i=>i.userId==this.user.id)[0].id
+            }else{
+              return ""
+            }
+          }
+         })
+         console.log('res===============',resArr)
+        if(resArr.length > 0){
+            ids = resArr.join(",").trim()
+            this.$axios.post(
+              "/plan/receivePlan",
+              {
+                ids:ids
+              }
+            ).then(res => {
+              if (res.code == "ok") {
+                this.isAllChecked=false
+                this.isCanAgree=false
+                this.getDistributionList()
+              } else {
+                this.$toast.clear();
+                this.$toast.fail(res.msg);
+              }
+            }).catch(err => { this.$toast.clear(); })
+        }
+    },
+    workShowHide(index) {
+      this.distributionList[index].flg = !this.distributionList[index].flg;
+      console.log('=========>',this.distributionList[index].flg)
+    },
     back() {
       this.$router.go(-1);
     },
+    // 删除分配人员
+    deletePeople(item) {
+      const _this=this
+      this.$axios.post(
+        "/plan/deletePeople",
+        {
+          id:item
+        }
+      ).then(res => {
+        if (res.code == "ok") {
+          this.getDistributionList()
+        } else {
+          this.$toast.clear();
+          this.$toast.fail(res.msg);
+        }
+      }).catch(err => { this.$toast.clear(); })
+    },
     // 下单计划
     placeAnOrder() {
-      console.log('点击了下单计划')
+      let ids=[this.id];
+
+      this.$axios.post(
+        "/plan/allocationPlan",
+        {
+          ids: ids.join(","),
+          planType: this.type
+        }
+      )
     },
     distributionProp(item, index) {
       if(this.beDeptList) {
@@ -120,6 +254,7 @@ export default {
       })
       .then(res => {
         if (res.code == "ok") {
+          res.data.forEach(item => { item.flg = false })
           this.distributionList = res.data
         } else {
           this.$toast.clear();
@@ -127,6 +262,27 @@ export default {
         }
       }).catch(err => { this.$toast.clear(); });
     },
+    //换人
+    changePeople(item,newPeopleId){
+        this.$axios.post('/plan/changePeople', {
+        departmentId: this.departmentId,
+      })
+      .then(res => {
+        if (res.code == "ok") {
+          this.peopleList = res.data.map(item => {
+            return {
+              name: item.name,
+              id: item.id,
+              phone: item.phone,
+              jobNumber: item.jobNumber
+            }
+          })
+        } else {
+          this.$toast.clear();
+          this.$toast.fail(res.msg);
+        }
+      }).catch(err => { this.$toast.clear(); });
+    },
     // 获取人员
     getPeople() {
       this.$axios.post('/user/getSimpleActiveUserList', {
@@ -151,6 +307,7 @@ export default {
     teamAllocation(item, nameArr){
       let newDistributionList = JSON.parse(JSON.stringify(this.distributionList[this.distributionIndex]))
       delete newDistributionList.prodProcedure
+      delete newDistributionList.prodProcedureTeamList
       this.$axios.post('/plan/teamAllocation', {
         ...newDistributionList,
         teamIds: item.join(","),
@@ -161,6 +318,7 @@ export default {
         this.$refs.ChooseSomeone['loadingBtn'] = false
         if (res.code == "ok") {
           this.distributionList[this.distributionIndex].teamNames = nameArr.join(',')
+          this.getDistributionList()
           this.popupShow = false
         } else {
           this.$toast.clear();
@@ -188,6 +346,18 @@ export default {
   * {
     box-sizing: border-box;
   }
+  .formBatch{
+        position: fixed;
+        bottom: 0;
+        width: 100%;
+        z-index: 2;
+        background-color: #fff;
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        height: 1.2rem;
+        border-top: 1px solid #ebebeb;
+    }
   .distribution {
     width: 100%;
     height: 100%;

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/planView/todayPlan/todayPlan.vue

@@ -3,7 +3,7 @@
     <van-nav-bar title="今日计划" left-text="返回" @click-left="back" fixed left-arrow />
     <div class="todayPlan flexCoum-box">
       <PlanComponent :titleText="'今日计划'" :planList="planList" v-if="planList.length > 0"></PlanComponent>
-      <van-empty description="无数据" v-else />
+      <van-empty description="无数据" v-else />
     </div>
   </div>
 </template>

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/planView/tomorrowPlan/tomorrowPlan.vue

@@ -3,7 +3,7 @@
     <van-nav-bar title="明日计划" left-text="返回" @click-left="back" fixed left-arrow/>
     <div class="todayPlan flexCoum-box">
       <PlanComponent :titleText="'明日计划'" :planList="planList" v-if="planList.length > 0"></PlanComponent>
-      <van-empty description="无数据" v-else />
+      <van-empty description="无数据" v-else />
     </div>
   </div>
 </template>

BIN
fhKeeper/formulahousekeeper/timesheet-workshop/favicon.ico


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

@@ -38,7 +38,7 @@
       </div>
 
       <!-- 各部分数据列表 -->
-      <el-table :data="tableData" style="width: 100%; flex: 1" v-loading="tableDataLoading"
+      <el-table :data="tableData" :height="'0'" style="width: 100%; flex: 1" v-loading="tableDataLoading"
         @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55"> </el-table-column>
         <el-table-column prop="taskChangeNoticeNum" label="通知号" width="180"></el-table-column>
@@ -916,7 +916,7 @@ export default {
   width: 100%;
   height: 100%;
   display: flex;
-  flex-wrap: wrap;
+  // flex-wrap: wrap;
   flex-direction: column;
   box-sizing: border-box;
   padding: 10px;
@@ -931,6 +931,7 @@ export default {
     flex: 1;
     display: flex;
     flex-direction: column;
+    overflow: auto;
   }
 
   .layout-container-floor {

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

@@ -8,7 +8,7 @@
         </div>
         <div class="OutSide_center">
           <div class="block">
-            <span class="demonstration">查询以往{{ titleText }}</span>
+            <span class="demonstration">查询{{ titleLeftText }}{{ titleText }}</span>
             <el-date-picker v-model="planDate" type="date" value-format="yyyy-MM-dd" :clearable="false" @change="getTableData(hasChooseDept)"
               placeholder="选择日期" size="small" :picker-options="planType == 1 ? toMPickerOptions : todayPickerOptions">
             </el-date-picker>
@@ -19,8 +19,8 @@
           </div>
         </div>
         <div class="OutSide_right">
-          <el-link type="primary" :underline="false" @click="(deptSetDialog = true), getPlanDeptSet()">{{ "部门设置"
-          }}</el-link>
+          <!-- <el-link type="primary" :underline="false" @click="(deptSetDialog = true), getPlanDeptSet()">{{ "部门设置"
+          }}</el-link> -->
           <el-link type="primary" :underline="false" @click="addPlan()">{{
             `新增${titleText}`
           }}</el-link>
@@ -34,12 +34,18 @@
     </div>
     <div class="layout-container-center">
       <!-- tab 切换 -->
-      <div class="today-tab">
-        <div v-for="(item, index) in hasSetDeptList" :key="index" :class="`${todayTabIndex === index ? 'on' : ''}`"
-          @click="tabChange(item, index)">
-          {{ item.departmentName }}
+      <div class="today-tab-btn">
+        <div class="today-tab">
+          <div v-for="(item, index) in hasSetDeptList" :key="index" :class="`${todayTabIndex === index ? 'on' : ''}`"
+            @click="tabChange(item, index)">
+            {{ item.departmentName }}
+          </div>
+        </div>
+        <div style="margin-left: 15px;" v-if="planType == 0">
+          <el-button type="primary" size="mini" @click="(deptSetDialog = true), getPlanDeptSet()">部门设置</el-button>
         </div>
       </div>
+      
 
       <!-- 各部分数据列表 -->
       <el-table :data="tableData" style="width: 100%;" height="0" v-loading="tableDataLoading"
@@ -72,7 +78,7 @@
         </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>
@@ -227,6 +233,9 @@ export default {
     todayDate: {
       type: String,
     },
+    titleLeftText: {
+      type: String,
+    },
   },
   data() {
     return {
@@ -853,6 +862,12 @@ export default {
 };
 </script>
 <style scoped lang='scss'>
+.today-tab-btn {
+  width: 100%;
+  display: flex;
+  align-items: center;
+  margin-bottom: 10px;
+}
 .colorText {
   color: #02a7f0;
   cursor: pointer;
@@ -946,11 +961,14 @@ export default {
   .today-tab {
     display: flex;
     overflow-x: auto;
-    margin-bottom: 10px;
+    align-items: center;
+    max-width: 90%;
+    overflow-x: auto;
 
     div {
       font-size: 16px;
       margin-left: 15px;
+      min-width: fit-content;      
       cursor: pointer;
     }
 

+ 11 - 8
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/planComponentDetil.vue

@@ -1,7 +1,7 @@
 <template>
     <div class='planComponentDetil'>
         <div class="planComponentDetil-top">
-            <div>{{ leftText }}</div>
+            <div style="color: #02A7F0;cursor: pointer;" @click="toBack()"><i class="el-icon-arrow-left" style="padding-right: 10px;"></i>{{ leftText }}</div>
             <div>{{ topText }}</div>
             <div></div>
         </div>
@@ -17,25 +17,25 @@
                 :key="tableKey"
                 style="width: 100%;"
                 v-loading="tableDataLoading">
-                    <el-table-column label="工序名称">
+                    <el-table-column label="工序名称" width="400">
                         <template slot-scope="scope">{{ scope.row.prodProcedure.name }}</template>
                     </el-table-column>
-                    <el-table-column label="单件工时">
+                    <el-table-column label="单件工时" width="150">
                         <template slot-scope="scope">{{ scope.row.prodProcedure.workingTime }}</template>
                     </el-table-column>
-                    <el-table-column label="总工时" width="180">
+                    <el-table-column label="总工时" width="150">
                         <template slot-scope="scope">{{ scope.row.totalWorkingHours }}</template>
                     </el-table-column>
-                    <el-table-column label="单件工价" width="180">
+                    <el-table-column label="单件工价" width="150">
                         <template slot-scope="scope">{{ scope.row.prodProcedure.unitPrice }}</template>
                     </el-table-column>
-                    <el-table-column label="总工价" width="180">
+                    <el-table-column label="总工价">
                         <template slot-scope="scope">{{ scope.row.totalWages }}</template>
                     </el-table-column>
-                    <el-table-column label="质检类型" width="180">
+                    <el-table-column label="质检类型">
                         <template slot-scope="scope">{{ scope.row.prodProcedure.checkType==0?"自检": scope.row.prodProcedure.checkType==1?"互检":"专检"}}</template>
                     </el-table-column>
-                    <el-table-column label="组员" width="180">
+                    <el-table-column label="组员" width="150">
                         <template slot-scope="scope">{{ scope.row.teamNames }}</template>
                     </el-table-column>
                 </el-table>
@@ -127,6 +127,9 @@ export default {
         this.getPlanDetail()
      },
     methods: {
+        toBack() {
+            this.$router.go(-1)
+        },
         tabChange(item, index) {
             this.TabIndex = index
             this.getPlanDetail()

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

@@ -1,6 +1,6 @@
 <template>
   <div class='layout-container'>
-    <PlanComponent :planType="'0'" :titleText="'今日计划'" :todayDate="todayDate"></PlanComponent>
+    <PlanComponent :planType="'0'" :titleText="'今日计划'" :titleLeftText="'以往'" :todayDate="todayDate"></PlanComponent>
   </div>
 </template>
 

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

@@ -1,6 +1,6 @@
 <template>
   <div class='layout-container'>
-    <PlanComponent :planType="'1'" :titleText="'明日计划'" :todayDate="todayDate"></PlanComponent>
+    <PlanComponent :planType="'1'" :titleText="'明日计划'" :titleLeftText="'未来'" :todayDate="todayDate"></PlanComponent>
   </div>
 </template>