中扬CRM客户关系管理系统
LSH
2024-03-27 92459e3e326488acae77e068c37eb4b96eae5ebf
#周计划
10个文件已添加
7个文件已修改
1582 ■■■■■ 已修改文件
src/main/java/com/zy/crm/common/CodeBuilder.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/controller/WeeklyController.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/controller/WeeklyCostTypesController.java 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/entity/Weekly.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/entity/WeeklyCostTypes.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/entity/WeeklyDailyPlan.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/entity/WeeklyDailyReality.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/entity/WeeklyFoll.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/entity/param/WeeklyDomainParam.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/mapper/WeeklyCostTypesMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/service/WeeklyCostTypesService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/service/impl/WeeklyCostTypesServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/utils/TimeCalculatorUtils.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/weekly.sql 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WeeklyCostTypesMapper.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/weekly/weekly.js 765 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/weekly/weekly.html 410 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/common/CodeBuilder.java
@@ -23,7 +23,7 @@
//        generator.url="localhost:1433;databasename=zy_crm";
//        generator.username="sa";
//        generator.password="sa@123";
        generator.table="man_weekly_foll";
        generator.table="man_weekly_cost_types";
        generator.packagePath="com.zy.crm.manager";
        generator.js = false;
        generator.html = false;
src/main/java/com/zy/crm/manager/controller/WeeklyController.java
@@ -1,12 +1,15 @@
package com.zy.crm.manager.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.common.DateUtils;
import com.zy.crm.manager.entity.ReimburseOnlineDetl;
import com.zy.crm.manager.entity.Weekly;
import com.zy.crm.manager.entity.WeeklyDailyPlan;
import com.zy.crm.manager.entity.param.WeeklyDomainParam;
import com.zy.crm.manager.service.WeeklyDailyPlanService;
import com.zy.crm.manager.service.WeeklyService;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
@@ -14,7 +17,9 @@
import com.core.common.R;
import com.core.domain.KeyValueVo;
import com.zy.crm.common.web.BaseController;
import com.zy.crm.manager.utils.TimeCalculatorUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@@ -24,6 +29,8 @@
    @Autowired
    private WeeklyService weeklyService;
    @Autowired
    private WeeklyDailyPlanService weeklyDailyPlanService;
    @RequestMapping(value = "/weekly/{id}/auth")
    @ManagerAuth
@@ -132,4 +139,64 @@
        return R.ok().add(vos);
    }
    @RequestMapping(value = "/weekly/from/add/auth")
    @ManagerAuth(memo = "周计划/日计划/日实际")
    @Transactional
    public R formAdd(@RequestBody WeeklyDomainParam param){
        try{
            if (Cools.isEmpty(param)){
                return R.error("参数为空:WeeklyDomainParam");
            } else if (Cools.isEmpty(param.getWeeklyDailyPlanList()) || param.getWeeklyDailyPlanList().size()==0){
                return R.error("参数为空:WeeklyDailyPlanList");
            } else if (Cools.isEmpty(param.getWeeklyType())){
                return R.error("参数为空:WeeklyDailyPlanList");
            } else if (Cools.isEmpty(param.getType())){
                return R.error("参数为空:Type");
            } else if (Cools.isEmpty(param.getWeeklyType())){
                return R.error("参数为空:Weekly");
            }
            Date now = new Date();
            Weekly weekly = new Weekly();
            weekly.setHostId(getHostId());
            weekly.setDeptId(getDeptId());               // 所属部门
            weekly.setUserId(getUserId());               // 所属人员
            weekly.setCreateBy(getUserId());
            weekly.setCreateTime(now);
            weekly.setUpdateBy(getUserId());
            weekly.setUpdateTime(now);
            List<Date> dateList = new ArrayList<>();//获取周一与周日日期
            switch (param.getType()){
                case 1:
                    dateList = TimeCalculatorUtils.WeeklyMondayAndSundayFront(now);
                    weekly.setStatus(2);
                    break;
                case 2:
                    dateList = TimeCalculatorUtils.WeeklyMondayAndSundayNow(now);
                    weekly.setStatus(1);
                    break;
                case 3:
                    dateList = TimeCalculatorUtils.WeeklyMondayAndSundayAfter(now);
                    weekly.setStatus(0);
                    break;
                default:
                    return R.error("参数异常:Weekly="+param.getType());
            }
            List<Date> dates = TimeCalculatorUtils.WeeklyListDays(dateList);//获取周一到周日日期
            System.out.println(dates.toString());
        } catch (Exception e){
            return R.error("异常:"+e);
        }
        return R.ok();
    }
    @RequestMapping(value = "/weekly/detl/all/auth")
    @Transactional
    public R head(@RequestParam Integer weeklyId){
        List<WeeklyDailyPlan> weeklyDailyPlans = weeklyDailyPlanService.selectList(new EntityWrapper<WeeklyDailyPlan>().eq("weekly_id", weeklyId));
        return R.ok().add(weeklyDailyPlans);
    }
}
src/main/java/com/zy/crm/manager/controller/WeeklyCostTypesController.java
New file
@@ -0,0 +1,162 @@
package com.zy.crm.manager.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.common.DateUtils;
import com.zy.crm.manager.entity.ReimburseCostTypes;
import com.zy.crm.manager.entity.ReimburseOnlineDetl;
import com.zy.crm.manager.entity.WeeklyCostTypes;
import com.zy.crm.manager.entity.WeeklyDailyPlan;
import com.zy.crm.manager.service.WeeklyCostTypesService;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.core.domain.KeyValueVo;
import com.zy.crm.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@RestController
public class WeeklyCostTypesController extends BaseController {
    @Autowired
    private WeeklyCostTypesService weeklyCostTypesService;
    @RequestMapping(value = "/weeklyCostTypes/{id}/auth")
    @ManagerAuth
    public R get(@PathVariable("id") String id) {
        return R.ok(weeklyCostTypesService.selectById(String.valueOf(id)));
    }
    @RequestMapping(value = "/weeklyCostTypes/list/auth")
    @ManagerAuth
    public R list(@RequestParam(defaultValue = "1")Integer curr,
                  @RequestParam(defaultValue = "10")Integer limit,
                  @RequestParam(required = false)String orderByField,
                  @RequestParam(required = false)String orderByType,
                  @RequestParam(required = false)String condition,
                  @RequestParam Map<String, Object> param){
        EntityWrapper<WeeklyCostTypes> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convert(param, wrapper);
        allLike(WeeklyCostTypes.class, param.keySet(), wrapper, condition);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
        return R.ok(weeklyCostTypesService.selectPage(new Page<>(curr, limit), wrapper));
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        for (Map.Entry<String, Object> entry : map.entrySet()){
            String val = String.valueOf(entry.getValue());
            if (val.contains(RANGE_TIME_LINK)){
                String[] dates = val.split(RANGE_TIME_LINK);
                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
            } else {
                wrapper.like(entry.getKey(), val);
            }
        }
    }
    @RequestMapping(value = "/weeklyCostTypes/add/auth")
    @ManagerAuth
    public R add(WeeklyCostTypes weeklyCostTypes) {
        weeklyCostTypesService.insert(weeklyCostTypes);
        return R.ok();
    }
    @RequestMapping(value = "/weeklyCostTypes/update/auth")
    @ManagerAuth
    public R update(WeeklyCostTypes weeklyCostTypes){
        if (Cools.isEmpty(weeklyCostTypes) || null==weeklyCostTypes.getId()){
            return R.error();
        }
        weeklyCostTypesService.updateById(weeklyCostTypes);
        return R.ok();
    }
    @RequestMapping(value = "/weeklyCostTypes/delete/auth")
    @ManagerAuth
    public R delete(@RequestParam(value="ids[]") Long[] ids){
         for (Long id : ids){
            weeklyCostTypesService.deleteById(id);
        }
        return R.ok();
    }
    @RequestMapping(value = "/weeklyCostTypes/export/auth")
    @ManagerAuth
    public R export(@RequestBody JSONObject param){
        EntityWrapper<WeeklyCostTypes> wrapper = new EntityWrapper<>();
        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
        Map<String, Object> map = excludeTrash(param.getJSONObject("weeklyCostTypes"));
        convert(map, wrapper);
        List<WeeklyCostTypes> list = weeklyCostTypesService.selectList(wrapper);
        return R.ok(exportSupport(list, fields));
    }
    @RequestMapping(value = "/weeklyCostTypesQuery/auth")
    @ManagerAuth
    public R query(String condition) {
        EntityWrapper<WeeklyCostTypes> wrapper = new EntityWrapper<>();
        wrapper.like("id", condition);
        Page<WeeklyCostTypes> page = weeklyCostTypesService.selectPage(new Page<>(0, 10), wrapper);
        List<Map<String, Object>> result = new ArrayList<>();
        for (WeeklyCostTypes weeklyCostTypes : page.getRecords()){
            Map<String, Object> map = new HashMap<>();
            map.put("id", weeklyCostTypes.getId());
            map.put("value", weeklyCostTypes.getId());
            result.add(map);
        }
        return R.ok(result);
    }
    @RequestMapping(value = "/weeklyCostTypes/check/column/auth")
    @ManagerAuth
    public R query(@RequestBody JSONObject param) {
        Wrapper<WeeklyCostTypes> wrapper = new EntityWrapper<WeeklyCostTypes>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
        if (null != weeklyCostTypesService.selectOne(wrapper)){
            return R.parse(BaseRes.REPEAT).add(getComment(WeeklyCostTypes.class, String.valueOf(param.get("key"))));
        }
        return R.ok();
    }
//    @RequestMapping("/weeklyCostTypes/all/get/kv")
//    @ManagerAuth
//    public R getDataKV(@RequestParam(required = false) String condition) {
//        List<KeyValueVo> vos = new ArrayList<>();
//        Wrapper<WeeklyCostTypes> wrapper = new EntityWrapper<WeeklyCostTypes>().andNew().like("id", condition).orderBy("create_time", false);
//        weeklyCostTypesService.selectPage(new Page<>(1, 30), wrapper).getRecords().forEach(item -> vos.add(new KeyValueVo(String.valueOf(item.getId()), item.getId())));
//        return R.ok().add(vos);
//    }
    @RequestMapping(value = "/weeklyCostTypes/covert/plan/{id}/auth")
    @ManagerAuth
    public R covert(@PathVariable("id") Integer id) {
        WeeklyDailyPlan weeklyDailyPlan = new WeeklyDailyPlan(id);
        return R.ok().add(weeklyDailyPlan);
    }
    // xm-select 搜索商品列表
    @RequestMapping("/weeklyCostTypes/all/get/kv")
    @ManagerAuth
    public R getReimburseCostTypesDataKV(@RequestParam(required = false) String condition) {
        Wrapper<WeeklyCostTypes> wrapper = new EntityWrapper<WeeklyCostTypes>()
                .andNew().like("type_name", condition);
        List<WeeklyCostTypes> weeklyCostTypesList = weeklyCostTypesService.selectPage(new Page<>(1, 30), wrapper).getRecords();
        List<com.zy.crm.manager.entity.result.KeyValueVo> valueVos = new ArrayList<>();
        for (WeeklyCostTypes weeklyCostTypes : weeklyCostTypesList) {
            com.zy.crm.manager.entity.result.KeyValueVo vo = new com.zy.crm.manager.entity.result.KeyValueVo();
            vo.setName(weeklyCostTypes.getTypeName());
            vo.setValue(weeklyCostTypes.getId());
            valueVos.add(vo);
        }
        return R.ok().add(valueVos);
    }
}
src/main/java/com/zy/crm/manager/entity/Weekly.java
@@ -42,6 +42,7 @@
     * ID
     */
    @ApiModelProperty(value= "ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
src/main/java/com/zy/crm/manager/entity/WeeklyCostTypes.java
New file
@@ -0,0 +1,43 @@
package com.zy.crm.manager.entity;
import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import com.baomidou.mybatisplus.annotations.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
@Data
@TableName("man_weekly_cost_types")
public class WeeklyCostTypes implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ID
     */
    @ApiModelProperty(value= "ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 名称
     */
    @ApiModelProperty(value= "名称")
    @TableField("type_name")
    private String typeName;
    public WeeklyCostTypes() {}
    public WeeklyCostTypes(String typeName) {
        this.typeName = typeName;
    }
//    WeeklyCostTypes weeklyCostTypes = new WeeklyCostTypes(
//            null    // 名称
//    );
}
src/main/java/com/zy/crm/manager/entity/WeeklyDailyPlan.java
@@ -5,6 +5,7 @@
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import com.baomidou.mybatisplus.annotations.TableField;
import com.zy.crm.manager.service.WeeklyCostTypesService;
import com.zy.crm.system.entity.*;
import com.zy.crm.system.service.*;
import org.springframework.format.annotation.DateTimeFormat;
@@ -41,6 +42,7 @@
     * ID
     */
    @ApiModelProperty(value= "ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
@@ -209,6 +211,28 @@
        this.memo = memo;
    }
    public WeeklyDailyPlan(Integer weeklyDay) {
        this.weeklyDay = weeklyDay;
//        this.userId = userId;
//        this.hostId = hostId;
//        this.deptId = deptId;
//        this.status = status;
//        this.settle = settle;
//        this.settleMsg = settleMsg;
//        this.comment = comment;
//        this.createBy = createBy;
//        this.createTime = createTime;
//        this.updateBy = updateBy;
//        this.updateTime = updateTime;
//        this.weeklyMatter = weeklyMatter;
//        this.director = director;
//        this.settleSize = settleSize;
//        this.settleCurrent = settleCurrent;
//        this.weeklyId = weeklyId;
//        this.cstmrId = cstmrId;
//        this.memo = memo;
    }
//    WeeklyDailyPlan weeklyDailyPlan = new WeeklyDailyPlan(
//            null,    // 日报日期[非空]
//            null,    // 所属人员[非空]
@@ -282,6 +306,16 @@
        }
    }
    public String getWeeklyDay$(){
        if (null == this.weeklyDay){ return ""; }
        WeeklyCostTypesService weeklyCostTypesService = SpringUtils.getBean(WeeklyCostTypesService.class);
        WeeklyCostTypes weeklyCostTypes = weeklyCostTypesService.selectById(this.weeklyDay);
        if (!Cools.isEmpty(weeklyCostTypes)){
            return String.valueOf(weeklyCostTypes.getTypeName());
        }
        return null;
    }
    public String getSettle$(){
        if (null == this.settle){ return null; }
        switch (this.settle){
src/main/java/com/zy/crm/manager/entity/WeeklyDailyReality.java
@@ -40,6 +40,7 @@
     * ID
     */
    @ApiModelProperty(value= "ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
src/main/java/com/zy/crm/manager/entity/WeeklyFoll.java
@@ -25,6 +25,7 @@
     * ID
     */
    @ApiModelProperty(value= "ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
src/main/java/com/zy/crm/manager/entity/param/WeeklyDomainParam.java
New file
@@ -0,0 +1,20 @@
package com.zy.crm.manager.entity.param;
import com.zy.crm.manager.entity.WeeklyDailyPlan;
import com.zy.crm.manager.entity.WeeklyDailyReality;
import lombok.Data;
import java.util.List;
@Data
public class WeeklyDomainParam {
    private Integer weeklyType;
    private Integer type;
    private List<WeeklyDailyPlan> weeklyDailyPlanList;
    private List<WeeklyDailyReality> weeklyDailyRealities;
}
src/main/java/com/zy/crm/manager/mapper/WeeklyCostTypesMapper.java
New file
@@ -0,0 +1,12 @@
package com.zy.crm.manager.mapper;
import com.zy.crm.manager.entity.WeeklyCostTypes;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface WeeklyCostTypesMapper extends BaseMapper<WeeklyCostTypes> {
}
src/main/java/com/zy/crm/manager/service/WeeklyCostTypesService.java
New file
@@ -0,0 +1,8 @@
package com.zy.crm.manager.service;
import com.zy.crm.manager.entity.WeeklyCostTypes;
import com.baomidou.mybatisplus.service.IService;
public interface WeeklyCostTypesService extends IService<WeeklyCostTypes> {
}
src/main/java/com/zy/crm/manager/service/impl/WeeklyCostTypesServiceImpl.java
New file
@@ -0,0 +1,12 @@
package com.zy.crm.manager.service.impl;
import com.zy.crm.manager.mapper.WeeklyCostTypesMapper;
import com.zy.crm.manager.entity.WeeklyCostTypes;
import com.zy.crm.manager.service.WeeklyCostTypesService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service("weeklyCostTypesService")
public class WeeklyCostTypesServiceImpl extends ServiceImpl<WeeklyCostTypesMapper, WeeklyCostTypes> implements WeeklyCostTypesService {
}
src/main/java/com/zy/crm/manager/utils/TimeCalculatorUtils.java
@@ -305,6 +305,18 @@
        return dateList;
    }
    //获取周一到周末
    public static List<Date> WeeklyListDays(List<Date> dates){
        Date date = dates.get(0);
        Date nowMonday = WeeklyMonday(date);
        List<Date> dateList = new ArrayList<>();
        dateList.add(nowMonday);
        for (int i = 1; i<7 ; i++){
            dateList.add(timeYesterdayN(nowMonday,i));
        }
        return dateList;
    }
    public static void main(String[] args) {
        Date now = new Date();
        int weeklyNowMonth = WeeklyNowMonthDay(now);
src/main/java/weekly.sql
New file
@@ -0,0 +1,18 @@
-- save weekly record
-- mysql
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'weekly/weekly.html', 'weekly管理', null , '2', null , '1');
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'weekly#view', '查询', '', '3', '0', '1');
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'weekly#btn-add', '新增', '', '3', '1', '1');
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'weekly#btn-edit', '编辑', '', '3', '2', '1');
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'weekly#btn-delete', '删除', '', '3', '3', '1');
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'weekly#btn-export', '导出', '', '3', '4', '1');
-- sqlserver
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'weekly/weekly.html', N'周计划', null, '2', null, '1');
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'weekly#view', N'查询', '', '3', '0', '1');
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'weekly#btn-add', N'新增', '', '3', '1', '1');
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'weekly#btn-edit', N'编辑', '', '3', '2', '1');
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'weekly#btn-delete', N'删除', '', '3', '3', '1');
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'weekly#btn-export', N'导出', '', '3', '4', '1');
src/main/resources/mapper/WeeklyCostTypesMapper.xml
New file
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.crm.manager.mapper.WeeklyCostTypesMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.crm.manager.entity.WeeklyCostTypes">
        <id column="id" property="id" />
        <result column="type_name" property="typeName" />
    </resultMap>
</mapper>
src/main/webapp/static/js/weekly/weekly.js
New file
@@ -0,0 +1,765 @@
var pageCurr;
var admin;
var treeCond;
layui.config({
    base: baseUrl + "/static/layui/lay/modules/"
}).extend({
    steps: 'steps/steps',
    cascader: 'cascader/cascader',
}).use(['table','laydate', 'form', 'admin', 'xmSelect', 'element', 'cascader', 'tree', 'dropdown'], function(){
    var table = layui.table;
    var $ = layui.jquery;
    var layer = layui.layer;
    var layDate = layui.laydate;
    var tree = layui.tree;
    var form = layui.form;
    var dropdown = layui.dropdown;
    admin = layui.admin;
    $('#organization').html(localStorage.getItem('nickname') + ' <i class="layui-icon">&#xe61a;</i>');
    // 部门人员 筛选
    dropdown.render({
        elem: '#organization'
        ,content: ['<div id="organizationTree" style="height: calc(100vh - 525px);border: none"></div>'].join('')
        ,style: 'width: 370px; height: 350px; padding: 0 15px; box-shadow: 1px 1px 30px rgb(0 0 0 / 12%);'
        ,ready: function(){
            loadTree();
        }
    });
    // 树形图
    var organizationTree;
    window.loadTree = function(condition){
        var loadIndex = layer.load(2);
        $.ajax({
            url: baseUrl+"/dept/user/tree/auth",
            headers: {'token': localStorage.getItem('token')},
            data: {
                'condition': condition
            },
            method: 'POST',
            success: function (res) {
                layer.close(loadIndex);
                if (res.code === 200){
                    organizationTree = tree.render({
                        elem: '#organizationTree',
                        id: 'organizationTree',
                        onlyIconControl: true,
                        data: res.data,
                        click: function (obj) {
                            treeCond = {
                                key: obj.data.key,
                                val: obj.data.id
                            }
                            $('#organization').html(obj.data.title + ' <i class="layui-icon">&#xe61a;</i>');
                            $('#organizationTree').find('.ew-tree-click').removeClass('ew-tree-click');
                            $(obj.elem).children('.layui-tree-entry').addClass('ew-tree-click');
                            clearFormVal($('#search-box'));
                            tableIns.reload({
                                where: {[obj.data.key]: obj.data.id},
                                page: {curr: 1}
                            });
                        }
                    });
                    treeData = res.data;
                } else if (res.code === 403){
                    top.location.href = baseUrl+"/";
                } else {
                    layer.msg(res.msg)
                }
            }
        })
    }
    // 数据渲染
    tableIns = table.render({
        elem: '#weekly',
        headers: {token: localStorage.getItem('token')},
        url: baseUrl+'/weekly/list/auth',
        page: true,
        limit: 16,
        limits: [16, 30, 50, 100, 200, 500],
        toolbar: '#toolbar',
        cellMinWidth: 150,
        cols: [[
            // {type: 'checkbox'},
            {field: 'id', align: 'center',title: 'ID',hide : true}
            ,{field: 'startTime$', align: 'center',title: '开始日期',hide : true}
            ,{field: 'endTime$', align: 'center',title: '结束日期',hide : true}
            ,{field: 'userId$', align: 'center',title: '所属人员',hide : true}
            ,{field: 'hostId$', align: 'center',title: '所属商户',hide : true}
            ,{field: 'deptId$', align: 'center',title: '所属部门',hide : true}
            ,{field: 'cstmrIdsReality', align: 'center',title: '实际甲方单位ID集合',hide : true}
            ,{field: 'status$', align: 'center',title: '状态',hide : false}
            ,{field: 'settle$', align: 'center',title: '进度',hide : false}
            ,{field: 'settleMsg', align: 'center',title: '审核进度',hide : true}
            ,{field: 'comment', align: 'center',title: '评论',hide : false}
            ,{field: 'createBy$', align: 'center',title: '添加人员',hide : true}
            ,{field: 'createTime$', align: 'center',title: '添加时间',hide : true}
            ,{field: 'updateBy$', align: 'center',title: '修改人员',hide : true}
            ,{field: 'updateTime$', align: 'center',title: 'update_time',hide : true}
            ,{field: 'memo', align: 'center',title: '备注(50字)',hide : false}
            ,{field: 'director$', align: 'center',title: '审批人',hide : true}
            ,{field: 'settleSize', align: 'center',title: '流程长度',hide : true}
            ,{field: 'settleCurrent', align: 'center',title: '当前进度',hide : true}
            ,{field: 'cstmrIdsPlan', align: 'center',title: '计划甲方单位ID集合',hide : true}
            ,{field: 'weeklyAll', align: 'center',title: '周数',hide : false}
            ,{field: 'weeklyNowMonth', align: 'center',title: '当月第几周',hide : true}
            ,{field: 'weeklyYear', align: 'center',title: '年',hide : true}
            ,{field: 'weeklyMonth', align: 'center',title: '月',hide : true}
            ,{field: 'weeklyDay', align: 'center',title: '日',hide : true}
            ,{field: 'weeklyDayMonth', align: 'center',title: '周',hide : true}
            ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width:120}
        ]],
        request: {
            pageName: 'curr',
            pageSize: 'limit'
        },
        parseData: function (res) {
            return {
                'code': res.code,
                'msg': res.msg,
                'count': res.data.total,
                'data': res.data.records
            }
        },
        response: {
            statusCode: 200
        },
        done: function(res, curr, count) {
            if (res.code === 403) {
                top.location.href = baseUrl+"/";
            }
            pageCurr=curr;
            limit();
        }
    });
    // 监听排序事件
    table.on('sort(weekly)', function (obj) {
        var searchData = {};
        $.each($('#search-box [name]').serializeArray(), function() {
            searchData[this.name] = this.value;
        });
        searchData['orderByField'] = obj.field;
        searchData['orderByType'] = obj.type;
        tableIns.reload({
            where: searchData,
            page: {
                curr: 1
            },
            done: function (res, curr, count) {
                if (res.code === 403) {
                    top.location.href = baseUrl+"/";
                }
                pageCurr=curr;
                limit();
            }
        });
    });
    // 监听头工具栏事件
    table.on('toolbar(weekly)', function (obj) {
        var checkStatus = table.checkStatus(obj.config.id);
        switch(obj.event) {
            case 'addBlank':
                showEditModel();
                break;
            case 'refreshData':
                tableIns.reload({
                    page: {
                        curr: pageCurr
                    }
                });
                limit();
                break;
            case 'deleteData':
                var data = checkStatus.data;
                var ids=[];
                data.map(function (track) {
                    ids.push(track.id);
                });
                if (ids.length === 0){
                    layer.msg('请选择数据');
                } else {
                    layer.confirm('确定删除'+(ids.length===1?'此':ids.length)+'条数据吗', function(){
                        $.ajax({
                            url: baseUrl+"/weekly/delete/auth",
                            headers: {'token': localStorage.getItem('token')},
                            data: {ids: ids},
                            method: 'POST',
                            traditional:true,
                            success: function (res) {
                                if (res.code === 200){
                                    layer.closeAll();
                                    tableReload(false);
                                } else if (res.code === 403){
                                    top.location.href = baseUrl+"/";
                                } else {
                                    layer.msg(res.msg)
                                }
                            }
                        })
                    });
                }
                break;
            case 'exportData':
                layer.confirm('确定导出Excel吗', {shadeClose: true}, function(){
                    var titles=[];
                    var fields=[];
                    obj.config.cols[0].map(function (col) {
                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
                            titles.push(col.title);
                            fields.push(col.field);
                        }
                    });
                    var exportData = {};
                    $.each($('#search-box [name]').serializeArray(), function() {
                        exportData[this.name] = this.value;
                    });
                    var param = {
                        'config': exportData,
                        'fields': fields
                    };
                    $.ajax({
                        url: baseUrl+"/weekly/export/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: JSON.stringify(param),
                        dataType:'json',
                        contentType:'application/json;charset=UTF-8',
                        method: 'POST',
                        success: function (res) {
                            layer.closeAll();
                            if (res.code === 200) {
                                table.exportFile(titles,res.data,'xls');
                            } else if (res.code === 403) {
                                top.location.href = baseUrl+"/";
                            } else {
                                layer.msg(res.msg)
                            }
                        }
                    });
                });
                break;
        }
    });
    // 监听行工具事件
    table.on('tool(weekly)', function(obj){
        var data = obj.data;
        switch (obj.event) {
            case 'approval2':
                layer.confirm('审批通过?', {
                    skin: 'layui-layer-admin',
                    shade: .1,
                    offset: '200px',
                    title: data.name
                }, function (i) {
                    layer.close(i);
                    approval2(data.id);
                });
                break;
            case 'more':
                top.weeklyByMore=data.id;
                console.log(top.weeklyByMore)
                admin.popupRight({
                    type: 1,
                    window: "top",
                    area: "1250px",
                    url: "weekly_more.html",
                    end: function () {
                        // $(".layui-laypage-btn")[0].click();
                    }
                })
                break;
            case 'del':
                layer.confirm('确定删除这条数据吗', function(){
                    $.ajax({
                        url: baseUrl+"/weekly/delete/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: {ids: data.id},
                        method: 'POST',
                        traditional:true,
                        success: function (res) {
                            if (res.code === 200){
                                layer.closeAll();
                                tableReload(false);
                            } else if (res.code === 403){
                                top.location.href = baseUrl+"/";
                            } else {
                                layer.msg(res.msg)
                            }
                        }
                    })
                });
                break;
            case "edit":
                showEditModel(data);
                break;
            case "look":
                var $a = $(obj.tr).find('a[lay-event="look"]');
                var offset = $a.offset();
                var top2 = offset.top;
                var left = offset.left;
                layer.open({
                    type: 1,
                    title: false,
                    area: '2100px',
                    offset: [top2 + 'px', (left - 1430 + $a.outerWidth()) + 'px'],
                    shade: .01,
                    shadeClose: true,
                    fixed: false,
                    content: '<table id="lookSSXMTable" lay-filter="lookSSXMTable"></table>',
                    success: function (layero) {
                        table.render({
                            elem: '#lookSSXMTable',
                            headers: {token: localStorage.getItem('token')},
                            url: baseUrl+'/weeklyDetl/list/auth',
                            where: {
                                order_id: data.id
                            },
                            page: true,
                            cellMinWidth: 100,
                            cols: [[
                                {type: 'checkbox'}
                                ,{field: 'id', align: 'center',title: 'ID'}
                                ,{field: 'dailyTime$', align: 'center',title: '日报日期'}
                                ,{field: 'userId$', align: 'center',title: '所属人员'}
                                ,{field: 'hostId$', align: 'center',title: '所属商户'}
                                ,{field: 'deptId$', align: 'center',title: '所属部门'}
                                ,{field: 'status$', align: 'center',title: '状态'}
                                ,{field: 'settle$', align: 'center',title: '进度'}
                                ,{field: 'settleMsg', align: 'center',title: '审核进度'}
                                ,{field: 'comment', align: 'center',title: '评论'}
                                ,{field: 'createBy$', align: 'center',title: '添加人员'}
                                ,{field: 'createTime$', align: 'center',title: '添加时间'}
                                ,{field: 'updateBy$', align: 'center',title: '修改人员'}
                                ,{field: 'updateTime$', align: 'center',title: 'update_time'}
                                ,{field: 'weeklyMatter', align: 'center',title: '需协助事项'}
                                ,{field: 'director$', align: 'center',title: '负责人'}
                                ,{field: 'settleSize', align: 'center',title: '流程长度'}
                                ,{field: 'settleCurrent', align: 'center',title: '当前进度'}
                                ,{field: 'weeklyId', align: 'center',title: '周报ID'}
                                ,{field: 'cstmrId', align: 'center',title: '甲方单位ID'}
                                ,{field: 'weeklyDay', align: 'center',title: '星期'}
                                ,{field: 'memo', align: 'center',title: '备注'}
                                ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width:120}
                            ]],
                            request: {
                                pageName: 'curr',
                                pageSize: 'limit'
                            },
                            parseData: function (res) {
                                return {
                                    'code': res.code,
                                    'msg': res.msg,
                                    'count': res.data.total,
                                    'data': res.data.records
                                }
                            },
                            response: {
                                statusCode: 200
                            },
                            done: function () {
                                $(layero).find('.layui-table-view').css('margin', '0');
                            },
                            size: ''
                        });
                    }
                });
                break;
        }
    });
    // 搜索
    form.on('submit(search)', function (data) {
        pageCurr = 1;
        pageCount = 0;
        tableReload();
    });
    // 显示表单弹窗
    function showEditModel(expTpe) {
        admin.open({
            type: 1,
            title: (expTpe ? '修改' : '添加') + '报销审批',
            content: $('#editDialog').html(),
            area: '2200px',
            success: function (layero, dIndex) {
                $(layero).children('.layui-layer-content').css('overflow', 'visible');
                var isExpAdd = !expTpe;
                // if (expTpe){
                //     document.getElementById('weeklyDisplay').style.display = 'none';
                // }
                // 回显数据
                form.val('editForm', expTpe);
                console.log(expTpe)
                if (expTpe) {
                    // $('#orderNo').attr("disabled", "disabled");
                }
                // 表单提交事件
                form.on('submit(weeklyEditSubmit)', function (data) {
                    // 组装数据
                    if (xxDataList.length <= 0) {
                        layer.tips('请添加报销明细', '#matAddBtnComment', {tips: [1, '#ff4c4c']});
                        return false;
                    }
                    let nList = admin.util.deepClone(xxDataList);
                    for (let xi = 0; xi < nList.length; xi++) {
                        // if (nList[xi].anfme <= 0){
                        //     layer.msg('明细修改数量不合法', {icon: 2});
                        //     return false;
                        // }
                    }
                    layer.load(2);
                    $.ajax({
                        url: baseUrl+"/weekly/from/" + (isExpAdd?"add":"modify") + "/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: JSON.stringify({
                            weeklyType: Number(data.field.weeklyType),
                            orderId: data.field.orderId,
                            // type: Number(data.field.type),
                            type: Number(1),
                            weeklyDailyPlanList: nList
                        }),
                        contentType:'application/json;charset=UTF-8',
                        method: 'POST',
                        success: function (res) {
                            console.log(data)
                            layer.closeAll('loading');
                            if (res.code === 200){
                                layer.close(dIndex);
                                $(".layui-laypage-btn")[0].click();
                                layer.msg(res.msg, {icon: 1});
                            } else if (res.code === 403){
                                top.location.href = baseUrl+"/";
                            }else {
                                layer.msg(res.msg, {icon: 2});
                            }
                        }
                    })
                    return false;
                });
                // 明细表格
                var xxDataList = [];
                var tbOptions = {
                    elem: '#formSSXMTable',
                    headers: {token: localStorage.getItem('token')},
                    data: xxDataList,
                    page: true,
                    height: '350px;',
                    cellMinWidth: 100,
                    cols: [[
                        {type: 'numbers', title: '#'}
                        ,{field: 'weeklyDay$', align: 'center',title: '星期'}
                        ,{field: 'comment', title: '评论', width: 100, style: 'color: blue;font-weight: bold', edit:true}
                        ,{field: 'weeklyMatter', title: '需协助事项', width: 100, style: 'color: blue;font-weight: bold', edit:true}
                        ,{field: 'dailyTime$', align: 'center',title: '日报日期'}
                        ,{field: 'settleMsg', align: 'center',title: '审核进度'}
                        ,{field: 'director', align: 'center',title: '负责人'}
                        ,{field: 'settleSize', align: 'center',title: '流程长度'}
                        ,{field: 'settleCurrent', align: 'center',title: '当前进度'}
                        ,{field: 'cstmrId', align: 'center',title: '甲方单位ID'}
                        ,{field: 'memo', align: 'center',title: '备注', width: 100, style: 'color: blue;font-weight: bold', edit:true}
                        ,{align: 'center', title: '操作', toolbar: '#formSSXMTableBar', minWidth: 80, width: 80, fixed: 'right'}
                    ]],
                    done: function (res, curr, count) {
                        $(layero).find('.layui-table-view').css('margin', '0');
                        var options = this;
                        // 获取当前行数据
                        table.getRowData = function(elem){
                            var index = $(elem).closest('tr').data('index');
                            return table.cache[options.id][index] || {};
                        };
                        $('.input-occupation').on('text', function(){
                            var value = this.value; // 获取选中项 value
                            var data = table.getRowData(this);
                            console.log(value);
                            console.log("value------===");
                            xxDataList.forEach(res => {
                                if (data.id === res.id){
                                    console.log(res)
                                    res.occupation = value;
                                }
                            })
                        });
                    },
                    size: ''
                };
                if (!isExpAdd) {
                    $.ajax({
                        url: baseUrl+"/weekly/detl/all/auth?weeklyId=" + expTpe.id,
                        headers: {'token': localStorage.getItem('token')},
                        method: 'GET',
                        async: false,
                        success: function (res) {
                            if (res.code === 200){
                                xxDataList = res.data;
                                tbOptions.data = xxDataList;
                            } else if (res.code === 403){
                                top.location.href = baseUrl+"/";
                            }else {
                                layer.msg(res.msg, {icon: 2})
                            }
                        }
                    })
                }
                var insTbSSXM = table.render(tbOptions);
                // 工具条点击事件
                table.on('tool(formSSXMTable)', function (obj) {
                    var data = obj.data;
                    var layEvent = obj.event;
                    if (layEvent === 'edit') {
                        showEditModel2(data);
                    } else if (layEvent === 'del') {
                        layer.confirm('确定要删除吗?', {
                            shade: .1,
                            skin: 'layui-layer-admin'
                        }, function (i) {
                            layer.close(i);
                            for (var j = 0; j < xxDataList.length; j++) {
                                if (xxDataList[j].matnr === data.matnr && xxDataList[j].batch === data.batch) {
                                    xxDataList.splice(j, 1);
                                    break;
                                }
                            }
                            insTbSSXM.reload({data: xxDataList, page: {curr: 1}});
                        });
                    }
                });
                // 明细数据修改
                table.on('edit(formSSXMTable)', function (obj) {
                    let index = obj.tr.attr("data-index");
                    let data = xxDataList[index];
                    if (obj.field === 'anfme'){
                        let vle = Number(obj.value);
                        if (isNaN(vle)) {
                            layer.msg("请输入数字", {icon: 2});
                            return false;
                        } else {
                            if (vle <= 0) {
                                layer.msg("数量必须大于零", {icon: 2});
                                return false;
                            }
                        }
                    }
                    data[obj.field] = obj.value;
                    insTbSSXM.reload({data: xxDataList});
                });
                $('#matAddBtnComment').click(function () {
                    showEditModel2();
                });
                // 显示添加明细表单弹窗
                function showEditModel2(exp) {
                    admin.open({
                        type: 1,
                        offset: '150px',
                        area: '680px',
                        title: (exp ? '修改' : '添加') + '明细',
                        content: $('#matEditDialog').html(),
                        success: function (layero, dIndex) {
                            // 回显数据
                            form.val('matEditForm', exp);
                            // 表单提交事件
                            form.on('submit(matEditSubmit)', function (data) {
                                let selectList = matXmSelect.getValue();
                                console.log(selectList)
                                for (let i = 0; i<selectList.length; i++) {
                                    let item = selectList[i];
                                    // 查询物料详情
                                    $.ajax({
                                        url: baseUrl+"/weeklyCostTypes/covert/plan/"+item.value+"/auth",
                                        headers: {'token': localStorage.getItem('token')},
                                        method: 'GET',
                                        async: false,
                                        success: function (res) {
                                            if (res.code === 200){
                                                var bige=true;
                                                if (bige){
                                                    // console.log("-------2.3-------")
                                                    xxDataList.push(res.data);
                                                    insTbSSXM.reload({data: xxDataList, page: {curr: 1}});
                                                }
                                            } else if (res.code === 403){
                                                top.location.href = baseUrl+"/";
                                            }else {
                                                layer.msg(res.msg, {icon: 2})
                                            }
                                        }
                                    })
                                }
                                layer.close(dIndex);
                                return false;
                            });
                            // 渲染物料选择
                            var matXmSelect = xmSelect.render({
                                el: '#weeklyCostTypes',
                                style: {
                                    width: '340px',
                                },
                                autoRow: true,
                                toolbar: { show: true },
                                filterable: true,
                                remoteSearch: true,
                                remoteMethod: function(val, cb, show){
                                    $.ajax({
                                        url: baseUrl+"/weeklyCostTypes/all/get/kv",
                                        headers: {'token': localStorage.getItem('token')},
                                        data: {
                                            condition: val
                                        },
                                        method: 'POST',
                                        success: function (res) {
                                            if (res.code === 200){
                                                cb(res.data)
                                            } else {
                                                cb([]);
                                                layer.msg(res.msg, {icon: 2});
                                            }
                                        }
                                    });
                                }
                            })
                            // 弹窗不出现滚动条
                            $(layero).children('.layui-layer-content').css('overflow', 'visible');
                            layui.form.render('select');
                        }
                    });
                }
            }
        });
    }
    function approval2(planId, plannerId, dIdx) {
        let loadIndex = layer.load(2);
        $.ajax({
            url: baseUrl+"/weekly/approval2/auth",
            headers: {'token': localStorage.getItem('token')},
            data: {
                planId: planId,
                plannerId: plannerId
            },
            method: 'POST',
            success: function (res) {
                if (dIdx) {
                    layer.close(dIdx);
                }
                layer.close(loadIndex);
                if (res.code === 200){
                    layer.msg(res.msg, {icon: 1});
                    tableReload();
                } else if (res.code === 403){
                    top.location.href = baseUrl+"/";
                } else {
                    layer.msg(res.msg, {icon: 2});
                }
            }
        })
    }
});
// 关闭动作
$(document).on('click','#data-detail-close', function () {
    parent.layer.closeAll();
});
function tableReload(child) {
    var searchData = {};
    $.each($('#search-box [name]').serializeArray(), function() {
        searchData[this.name] = this.value;
    });
    (child ? parent.tableIns : tableIns).reload({
        where: searchData,
        page: {
            curr: pageCurr
        },
        done: function (res, curr, count) {
            if (res.code === 403) {
                top.location.href = baseUrl+"/";
            }
            pageCurr=curr;
            if (res.data.length === 0 && count !== 0) {
                tableIns.reload({
                    where: searchData,
                    page: {
                        curr: pageCurr-1
                    }
                });
                pageCurr -= 1;
            }
            limit(child);
        }
    });
}
function setFormVal(el, data, showImg) {
    for (var val in data) {
        var find = el.find(":input[id='" + val + "']");
        find.val(data[val]);
        if (showImg){
            var next = find.next();
            if (next.get(0)){
                if (next.get(0).localName === "img") {
                    find.hide();
                    next.attr("src", data[val]);
                    next.show();
                }
            }
        }
    }
}
function clearFormVal(el) {
    $(':input', el)
        .val('')
        .removeAttr('checked')
        .removeAttr('selected');
}
function detailScreen(index) {
    var detail = layer.getChildFrame('#data-detail', index);
    var height = detail.height()+60;
    if (height > ($(window).height()*0.9)) {
        height = ($(window).height()*0.9);
    }
    layer.style(index, {
        top: (($(window).height()-height)/3)+"px",
        height: height+'px'
    });
    $(".layui-layer-shade").remove();
}
$('body').keydown(function () {
    if (event.keyCode === 13) {
        $("#search").click();
    }
});
// 压缩
function zip(data) {
    if (!data) return data
    // 判断数据是否需要转为JSON
    const dataJson = typeof data !== 'string' && typeof data !== 'number' ? JSON.stringify(data) : data
    // 使用Base64.encode处理字符编码,兼容中文
    const str = Base64.encode(dataJson)
    let binaryString = pako.gzip(str);
    let arr = Array.from(binaryString);
    let s = "";
    arr.forEach((item, index) => {
        s += String.fromCharCode(item)
    })
    return btoa(s)
}
src/main/webapp/views/weekly/weekly.html
New file
@@ -0,0 +1,410 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
    <link rel="stylesheet" href="../../static/css/tree.css" media="all">
    <link rel="stylesheet" href="../../static/layui/lay/modules/formDesigner/coolForm.css"/>
    <style>
        .nav-box {
            position: absolute;
            top: 1px;
            left: 5px;
        }
        .nav-box-item {
            display: inline-block;
            vertical-align: middle;
            margin-right: 5px;
        }
    </style>
</head>
<body>
<div class="layui-fluid">
    <div class="layui-card">
        <div class="layui-card-body">
            <div id="search-box" class="layui-form toolbar"
                 style="display: flex;justify-content: flex-end;position: relative">
                <div class="nav-box">
                    <div class="nav-box-item">
                        <i class="layui-icon" style="color: #1890ff;font-weight: bold">&#xe613;</i>
                    </div>
                    <div class="nav-box-item">
                        <button id="organization" style="border: none;padding-right: 35px;"
                                class="layui-btn layui-btn-primary icon-btn">
                            未知
                        </button>
                    </div>
                </div>
                <div class="layui-form-item">
                    <div class="layui-inline">
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="condition" placeholder="请输入" autocomplete="off"
                                   style="border-color: #e1e1e1">
                        </div>
                    </div>
                    <div class="layui-inline">&emsp;
                        <button class="layui-btn icon-btn layui-btn-sm" lay-filter="search" lay-submit>
                            <i class="layui-icon">&#xe615;</i>搜索
                        </button>
                    </div>
                </div>
            </div>
            <table class="layui-hide" id="weekly" lay-filter="weekly"></table>
        </div>
    </div>
</div>
<!-- 表格操作列 -->
<script type="text/html" id="tbLook">
    <span class="layui-text">
        <a href="javascript:;" lay-event="look">
            <i class="layui-icon" style="font-size: 12px;">&#xe61a;</i> 查看周计划
        </a>
    </span>
</script>
<script type="text/html" id="toolbar">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-sm" lay-event="addBlank">创建周计划</button>
        <!--    <button class="layui-btn layui-btn-sm layui-btn-danger" lay-event="deleteData">删除</button>-->
    </div>
</script>
<form id="uploadFile" enctype="multipart/form-data" style="display: none;">
    <input type="file" name="file" id="uploadQuote">
    <input type="button" onclick="upload()" value="上传"/>
</form>
<script type="text/html" id="operate">
    {{# if (d.settle == 1 || d.settle == 2 || d.settle == 3 || d.settle == 4 || d.settle == 5) { }}
    <a class="layui-btn layui-btn-xs btn-edit" lay-event="approval2">审批</a>
    {{# } }}
    {{# if (d.settle == 0) { }}
    <a class="layui-btn layui-btn-xs btn-edit" lay-event="approval2">提交</a>
    {{# } }}
    <!--  <a class="layui-btn layui-btn-xs btn-edit" lay-event="approval">提交</a>-->
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">编辑</a>
    <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a>
</script>
<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/luckysheet_js/luckyexcel.umd.js"></script>
<script type="text/javascript" src="../../static/js/luckysheet_js/pako.es5.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/luckysheet_js/base64.min.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/weekly/weekly.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/layui/lay/modules/cascader/citys-data.js" charset="utf-8"></script>
<script type="text/html" id="editDialog">
    <form id="editForm" lay-filter="editForm" class="layui-form model-form">
        <input name="id" type="hidden"/>
<!--        <div class="layui-form-item" style="display: block" id="weeklyDisplay">-->
<!--            <label class="layui-form-label">项目名: </label>-->
<!--            <div class="layui-input-block cool-auto-complete">-->
<!--                <input class="layui-input" name="orderId" placeholder="请输入项目名" style="display: none">-->
<!--                <input id="orderId$" name="orderId$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入项目名" onfocus=this.blur()>-->
<!--                <div class="cool-auto-complete-window">-->
<!--                    <input class="cool-auto-complete-window-input" data-key="orderQueryNameBydirector" onkeyup="autoLoad(this.getAttribute('data-key'))">-->
<!--                    <select class="cool-auto-complete-window-select" data-key="orderQueryNameBydirectorSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">-->
<!--                    </select>-->
<!--                </div>-->
<!--            </div>-->
<!--        </div>-->
        <div class="layui-form-item">
            <label class="layui-form-label layui-form-required">日期: </label>
            <div class="layui-input-inline">
                <select class="layui-input" name="weeklyType" lay-vertype="tips" lay-verify="required">
                    <option style="display: none"></option>
                    <option value="1">上周</option>
                    <option value="2">本周</option>
                    <option value="3">下周</option>
                </select>
            </div>
        </div>
<!--        <div class="layui-form-item">-->
<!--            <label class="layui-form-label layui-form-required">类型: </label>-->
<!--            <div class="layui-input-inline">-->
<!--                <select class="layui-input" name="type" lay-vertype="tips" lay-verify="required">-->
<!--                    <option style="display: none"></option>-->
<!--                    <option value="1">计划</option>-->
<!--                    <option value="2">实际</option>-->
<!--                </select>-->
<!--            </div>-->
<!--        </div>-->
        <div class="layui-form-item" style="position: relative;">
            <label class="layui-form-label">周计划:</label>
            <div class="layui-input-block">
                <table id="formSSXMTable" lay-filter="formSSXMTable"></table>
            </div>
            <button class="layui-btn layui-btn-sm icon-btn" id="matAddBtnComment"
                    style="position: absolute; left: 20px;top: 60px;padding: 0 5px;" type="button">
                <i class="layui-icon">&#xe654;</i>添加日计划
            </button>
        </div>
        <div class="layui-form-item text-right">
            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
            <button class="layui-btn" lay-filter="weeklyEditSubmit" lay-submit>保存</button>
        </div>
    </form>
</script>
<!-- 表格操作列 -->
<script type="text/html" id="formSSXMTableBar">
    <!--    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">修改</a>-->
    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>
<!-- 表单弹窗 -->
<script type="text/html" id="matEditDialog">
    <form id="matEditForm" lay-filter="matEditForm" class="layui-form model-form">
        <input name="experimentId" type="hidden"/>
        <div class="layui-form-item" style="float: left">
            <label class="layui-form-label">费用类型 - 多选</label>
            <div class="layui-input-block">
                <div id="weeklyCostTypes" name="weeklyCostTypes">
                </div>
            </div>
        </div>
        <div class="layui-form-item text-right" style="display: inline-block; margin-left: 35px">
            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
            <button class="layui-btn" lay-filter="matEditSubmit" lay-submit>保存</button>
        </div>
    </form>
</script>
<!--&lt;!&ndash; 表单弹窗 &ndash;&gt;-->
<!--<script type="text/html" id="editDialog">-->
<!--    <form id="detail" lay-filter="detail" class="layui-form admin-form model-form">-->
<!--        <input name="id" type="hidden">-->
<!--        <div class="layui-row">-->
<!--            <div class="layui-col-md12">-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">开始日期: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="startTime" id="startTime$" placeholder="请输入开始日期" lay-vertype="tips" lay-verify="required">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">结束日期: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="endTime" id="endTime$" placeholder="请输入结束日期" lay-vertype="tips" lay-verify="required">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">所属人员: </label>-->
<!--                    <div class="layui-input-block cool-auto-complete">-->
<!--                        <input class="layui-input" name="userId" placeholder="请输入所属人员" lay-vertype="tips" lay-verify="required" style="display: none">-->
<!--                        <input id="userId$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入所属人员" onfocus=this.blur()>-->
<!--                        <div class="cool-auto-complete-window">-->
<!--                            <input class="cool-auto-complete-window-input" data-key="userQueryByuserId" onkeyup="autoLoad(this.getAttribute('data-key'))">-->
<!--                            <select class="cool-auto-complete-window-select" data-key="userQueryByuserIdSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">-->
<!--                            </select>-->
<!--                        </div>-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">所属商户: </label>-->
<!--                    <div class="layui-input-block cool-auto-complete">-->
<!--                        <input class="layui-input" name="hostId" placeholder="请输入所属商户" lay-vertype="tips" lay-verify="required" style="display: none">-->
<!--                        <input id="hostId$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入所属商户" onfocus=this.blur()>-->
<!--                        <div class="cool-auto-complete-window">-->
<!--                            <input class="cool-auto-complete-window-input" data-key="hostQueryByhostId" onkeyup="autoLoad(this.getAttribute('data-key'))">-->
<!--                            <select class="cool-auto-complete-window-select" data-key="hostQueryByhostIdSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">-->
<!--                            </select>-->
<!--                        </div>-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">所属部门: </label>-->
<!--                    <div class="layui-input-block cool-auto-complete">-->
<!--                        <input class="layui-input" name="deptId" placeholder="请输入所属部门" lay-vertype="tips" lay-verify="required" style="display: none">-->
<!--                        <input id="deptId$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入所属部门" onfocus=this.blur()>-->
<!--                        <div class="cool-auto-complete-window">-->
<!--                            <input class="cool-auto-complete-window-input" data-key="deptQueryBydeptId" onkeyup="autoLoad(this.getAttribute('data-key'))">-->
<!--                            <select class="cool-auto-complete-window-select" data-key="deptQueryBydeptIdSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">-->
<!--                            </select>-->
<!--                        </div>-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">实际甲方单位ID集合: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="cstmrIdsReality" placeholder="请输入实际甲方单位ID集合">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">状态: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <select name="status" lay-vertype="tips" lay-verify="required">-->
<!--                            <option value="">请选择状态</option>-->
<!--                            <option value="3">已关闭</option>-->
<!--                            <option value="2">需处理</option>-->
<!--                            <option value="1">进行中</option>-->
<!--                            <option value="0">未开始</option>-->
<!--                        </select>-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">进度: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <select name="settle">-->
<!--                            <option value="">请选择进度</option>-->
<!--                            <option value="0">默认</option>-->
<!--                            <option value="1">开始</option>-->
<!--                            <option value="2">组长待审</option>-->
<!--                            <option value="3">组长审核</option>-->
<!--                            <option value="4">规划待审</option>-->
<!--                            <option value="5">规划审核</option>-->
<!--                            <option value="6">审批中</option>-->
<!--                            <option value="7">审批通过</option>-->
<!--                        </select>-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">审核进度: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="settleMsg" placeholder="请输入审核进度">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">评论: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="comment" placeholder="请输入评论">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">添加人员: </label>-->
<!--                    <div class="layui-input-block cool-auto-complete">-->
<!--                        <input class="layui-input" name="createBy" placeholder="请输入添加人员" lay-vertype="tips" lay-verify="required" style="display: none">-->
<!--                        <input id="createBy$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入添加人员" onfocus=this.blur()>-->
<!--                        <div class="cool-auto-complete-window">-->
<!--                            <input class="cool-auto-complete-window-input" data-key="userQueryBycreateBy" onkeyup="autoLoad(this.getAttribute('data-key'))">-->
<!--                            <select class="cool-auto-complete-window-select" data-key="userQueryBycreateBySelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">-->
<!--                            </select>-->
<!--                        </div>-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">添加时间: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="createTime" id="createTime$" placeholder="请输入添加时间" lay-vertype="tips" lay-verify="required">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">修改人员: </label>-->
<!--                    <div class="layui-input-block cool-auto-complete">-->
<!--                        <input class="layui-input" name="updateBy" placeholder="请输入修改人员" lay-vertype="tips" lay-verify="required" style="display: none">-->
<!--                        <input id="updateBy$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入修改人员" onfocus=this.blur()>-->
<!--                        <div class="cool-auto-complete-window">-->
<!--                            <input class="cool-auto-complete-window-input" data-key="userQueryByupdateBy" onkeyup="autoLoad(this.getAttribute('data-key'))">-->
<!--                            <select class="cool-auto-complete-window-select" data-key="userQueryByupdateBySelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">-->
<!--                            </select>-->
<!--                        </div>-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">update_time: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="updateTime" id="updateTime$" placeholder="请输入update_time" lay-vertype="tips" lay-verify="required">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">备注(50字): </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="memo" placeholder="请输入备注(50字)">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">审批人: </label>-->
<!--                    <div class="layui-input-block cool-auto-complete">-->
<!--                        <input class="layui-input" name="director" placeholder="请输入审批人" lay-vertype="tips" lay-verify="required" style="display: none">-->
<!--                        <input id="director$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入审批人" onfocus=this.blur()>-->
<!--                        <div class="cool-auto-complete-window">-->
<!--                            <input class="cool-auto-complete-window-input" data-key="userQueryBydirector" onkeyup="autoLoad(this.getAttribute('data-key'))">-->
<!--                            <select class="cool-auto-complete-window-select" data-key="userQueryBydirectorSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">-->
<!--                            </select>-->
<!--                        </div>-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">流程长度: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="settleSize" placeholder="请输入流程长度" lay-vertype="tips" lay-verify="required">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">当前进度: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="settleCurrent" placeholder="请输入当前进度">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">计划甲方单位ID集合: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="cstmrIdsPlan" placeholder="请输入计划甲方单位ID集合">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">周数: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="weeklyAll" placeholder="请输入周数" lay-vertype="tips" lay-verify="required">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">当月第几周: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="weeklyNowMonth" placeholder="请输入当月第几周" lay-vertype="tips" lay-verify="required">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">年: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="weeklyYear" placeholder="请输入年" lay-vertype="tips" lay-verify="required">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">月: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="weeklyMonth" placeholder="请输入月" lay-vertype="tips" lay-verify="required">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">日: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="weeklyDay" placeholder="请输入日" lay-vertype="tips" lay-verify="required">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">周: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="weeklyDayMonth" placeholder="请输入周" lay-vertype="tips" lay-verify="required">-->
<!--                    </div>-->
<!--                </div>-->
<!--            </div>-->
<!--        </div>-->
<!--        <hr class="layui-bg-gray">-->
<!--        <div class="layui-form-item text-right">-->
<!--            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">保存</button>-->
<!--            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>-->
<!--        </div>-->
<!--    </form>-->
<!--</script>-->
</body>
</html>