From 12987ac633bf7625f3d510f334ce1db334b86a64 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@63.com>
Date: 星期六, 19 十一月 2022 08:34:09 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/crm/manager/service/impl/PlanServiceImpl.java |   12 
 src/main/resources/mapper/PlanMapper.xml                           |   40 +
 src/main/java/com/zy/crm/manager/controller/PlanController.java    |  135 +++++
 src/main/webapp/static/js/plan/plan.js                             |  554 ++++++++++++++++++++
 src/main/java/com/zy/crm/manager/service/PlanService.java          |    8 
 src/main/webapp/views/plan/plan.html                               |  335 ++++++++++++
 src/main/java/com/zy/crm/common/CodeBuilder.java                   |    2 
 src/main/java/com/zy/crm/manager/entity/Plan.java                  |  470 +++++++++++++++++
 src/main/java/com/zy/crm/manager/mapper/PlanMapper.java            |   12 
 9 files changed, 1,567 insertions(+), 1 deletions(-)

diff --git a/src/main/java/com/zy/crm/common/CodeBuilder.java b/src/main/java/com/zy/crm/common/CodeBuilder.java
index abcf047..e524948 100644
--- a/src/main/java/com/zy/crm/common/CodeBuilder.java
+++ b/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_plan_need";
+        generator.table="man_plan";
         generator.packagePath="com.zy.crm.manager";
 //        generator.js = false;
 //        generator.html = false;
diff --git a/src/main/java/com/zy/crm/manager/controller/PlanController.java b/src/main/java/com/zy/crm/manager/controller/PlanController.java
new file mode 100644
index 0000000..39ff7bb
--- /dev/null
+++ b/src/main/java/com/zy/crm/manager/controller/PlanController.java
@@ -0,0 +1,135 @@
+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.Plan;
+import com.zy.crm.manager.service.PlanService;
+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 PlanController extends BaseController {
+
+    @Autowired
+    private PlanService planService;
+
+    @RequestMapping(value = "/plan/{id}/auth")
+    @ManagerAuth
+    public R get(@PathVariable("id") String id) {
+        return R.ok(planService.selectById(String.valueOf(id)));
+    }
+
+    @RequestMapping(value = "/plan/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<Plan> wrapper = new EntityWrapper<>();
+        excludeTrash(param);
+        convert(param, wrapper);
+        allLike(Plan.class, param.keySet(), wrapper, condition);
+        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
+        return R.ok(planService.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 = "/plan/add/auth")
+    @ManagerAuth
+    public R add(Plan plan) {
+        planService.insert(plan);
+        return R.ok();
+    }
+
+	@RequestMapping(value = "/plan/update/auth")
+	@ManagerAuth
+    public R update(Plan plan){
+        if (Cools.isEmpty(plan) || null==plan.getId()){
+            return R.error();
+        }
+        planService.updateById(plan);
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/plan/delete/auth")
+    @ManagerAuth
+    public R delete(@RequestParam(value="ids[]") Long[] ids){
+         for (Long id : ids){
+            planService.deleteById(id);
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/plan/export/auth")
+    @ManagerAuth
+    public R export(@RequestBody JSONObject param){
+        EntityWrapper<Plan> wrapper = new EntityWrapper<>();
+        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
+        Map<String, Object> map = excludeTrash(param.getJSONObject("plan"));
+        convert(map, wrapper);
+        List<Plan> list = planService.selectList(wrapper);
+        return R.ok(exportSupport(list, fields));
+    }
+
+    @RequestMapping(value = "/planQuery/auth")
+    @ManagerAuth
+    public R query(String condition) {
+        EntityWrapper<Plan> wrapper = new EntityWrapper<>();
+        wrapper.like("name", condition);
+        Page<Plan> page = planService.selectPage(new Page<>(0, 10), wrapper);
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (Plan plan : page.getRecords()){
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", plan.getId());
+            map.put("value", plan.getName());
+            result.add(map);
+        }
+        return R.ok(result);
+    }
+
+    @RequestMapping(value = "/plan/check/column/auth")
+    @ManagerAuth
+    public R query(@RequestBody JSONObject param) {
+        Wrapper<Plan> wrapper = new EntityWrapper<Plan>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
+        if (null != planService.selectOne(wrapper)){
+            return R.parse(BaseRes.REPEAT).add(getComment(Plan.class, String.valueOf(param.get("key"))));
+        }
+        return R.ok();
+    }
+
+    @RequestMapping("/plan/all/get/kv")
+    @ManagerAuth
+    public R getDataKV(@RequestParam(required = false) String condition) {
+        List<KeyValueVo> vos = new ArrayList<>();
+        Wrapper<Plan> wrapper = new EntityWrapper<Plan>().andNew().like("name", condition).orderBy("create_time", false);
+        planService.selectPage(new Page<>(1, 30), wrapper).getRecords().forEach(item -> vos.add(new KeyValueVo(String.valueOf(item.getName()), item.getId())));
+        return R.ok().add(vos);
+    }
+
+}
diff --git a/src/main/java/com/zy/crm/manager/entity/Plan.java b/src/main/java/com/zy/crm/manager/entity/Plan.java
new file mode 100644
index 0000000..f73dec4
--- /dev/null
+++ b/src/main/java/com/zy/crm/manager/entity/Plan.java
@@ -0,0 +1,470 @@
+package com.zy.crm.manager.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.core.common.Cools;
+import com.core.common.SpringUtils;
+import com.zy.crm.manager.service.CstmrService;
+import com.zy.crm.manager.service.PlanNeedService;
+import com.zy.crm.manager.service.PlanTypeService;
+import com.zy.crm.system.entity.Dept;
+import com.zy.crm.system.entity.Host;
+import com.zy.crm.system.entity.User;
+import com.zy.crm.system.service.DeptService;
+import com.zy.crm.system.service.HostService;
+import com.zy.crm.system.service.UserService;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@Data
+@TableName("man_plan")
+public class Plan implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鎵�灞炲晢鎴�
+     */
+    @ApiModelProperty(value= "鎵�灞炲晢鎴�")
+    @TableField("host_id")
+    private Long hostId;
+
+    /**
+     * 鎵�灞為儴闂�
+     */
+    @ApiModelProperty(value= "鎵�灞為儴闂�")
+    @TableField("dept_id")
+    private Long deptId;
+
+    /**
+     * 涓氬姟绫诲瀷
+     */
+    @ApiModelProperty(value= "涓氬姟绫诲瀷")
+    @TableField("plan_type")
+    private Long planType;
+
+    /**
+     * 涓氬姟鍛�
+     */
+    @ApiModelProperty(value= "涓氬姟鍛�")
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 璺熻釜椤圭洰
+     */
+    @ApiModelProperty(value= "璺熻釜椤圭洰")
+    @TableField("order_id")
+    private Long orderId;
+
+    /**
+     * 鐢叉柟鍗曚綅
+     */
+    @ApiModelProperty(value= "鐢叉柟鍗曚綅")
+    @TableField("cstmr_id")
+    private Long cstmrId;
+
+    /**
+     * 瑙勫垝鍗曚唬鍙�
+     */
+    @ApiModelProperty(value= "瑙勫垝鍗曚唬鍙�")
+    private String uuid;
+
+    /**
+     * 瑙勫垝鍗曞悕绉�
+     */
+    @ApiModelProperty(value= "瑙勫垝鍗曞悕绉�")
+    private String name;
+
+    /**
+     * 鐢宠鏃ユ湡
+     */
+    @ApiModelProperty(value= "鐢宠鏃ユ湡")
+    @TableField("apple_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date appleTime;
+
+    /**
+     * 鏂规鎵�闇�
+     */
+    @ApiModelProperty(value= "鏂规鎵�闇�")
+    @TableField("plan_need")
+    private Long planNeed;
+
+    /**
+     * 绔嬮」 1: 鏄�  0: 鍚�
+     */
+    @ApiModelProperty(value= "绔嬮」 1: 鏄�  0: 鍚�  ")
+    @TableField("be_item")
+    private Integer beItem;
+
+    /**
+     * 瑙勫垝鍛�
+     */
+    @ApiModelProperty(value= "瑙勫垝鍛�")
+    private String planner;
+
+    /**
+     * 瀹屾垚鏃堕棿
+     */
+    @ApiModelProperty(value= "瀹屾垚鏃堕棿")
+    @TableField("finish_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date finishTime;
+
+    /**
+     * 琛ㄥ崟鍐呭
+     */
+    @ApiModelProperty(value= "琛ㄥ崟鍐呭")
+    private String form;
+
+    /**
+     * 鏇存敼鏂规 1: 鏄�  0: 鍚�
+     */
+    @ApiModelProperty(value= "鏇存敼鏂规 1: 鏄�  0: 鍚�  ")
+    private Integer change;
+
+    /**
+     * 鏇存敼娆℃暟
+     */
+    @ApiModelProperty(value= "鏇存敼娆℃暟")
+    @TableField("change_time")
+    private Integer changeTime;
+
+    /**
+     * 鏇存敼鏂规鍘熷洜
+     */
+    @ApiModelProperty(value= "鏇存敼鏂规鍘熷洜")
+    @TableField("change_reason")
+    private String changeReason;
+
+    /**
+     * 瑙勬牸濂栭噾
+     */
+    @ApiModelProperty(value= "瑙勬牸濂栭噾")
+    @TableField("plan_bonus")
+    private Double planBonus;
+
+    /**
+     * 瑙勬牸缁勯暱濂栭噾
+     */
+    @ApiModelProperty(value= "瑙勬牸缁勯暱濂栭噾")
+    @TableField("plan_leader_bonus")
+    private Double planLeaderBonus;
+
+    /**
+     * 闄勪欢
+     */
+    @ApiModelProperty(value= "闄勪欢")
+    private String files;
+
+    /**
+     * 杩涘害 1: 寮�濮�  2: 缁勯暱寰呭  3: 缁勯暱瀹℃牳  4: 瑙勫垝寰呭  5: 瑙勫垝瀹℃牳  6: 瀹℃壒涓�  7: 瀹℃壒閫氳繃
+     */
+    @ApiModelProperty(value= "杩涘害 1: 寮�濮�  2: 缁勯暱寰呭  3: 缁勯暱瀹℃牳  4: 瑙勫垝寰呭  5: 瑙勫垝瀹℃牳  6: 瀹℃壒涓�  7: 瀹℃壒閫氳繃  ")
+    private Integer settle;
+
+    /**
+     * 瀹℃牳杩涘害
+     */
+    @ApiModelProperty(value= "瀹℃牳杩涘害")
+    @TableField("settle_msg")
+    private String settleMsg;
+
+    /**
+     * 璇勮
+     */
+    @ApiModelProperty(value= "璇勮")
+    private String comment;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 绂佺敤
+     */
+    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 绂佺敤  ")
+    private Integer status;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    @TableField("create_by")
+    private Long createBy;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @TableField("create_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    @TableField("update_by")
+    private Long updateBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @TableField("update_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 娉ㄩ噴
+     */
+    @ApiModelProperty(value= "娉ㄩ噴")
+    private String memo;
+
+    public Plan() {}
+
+    public Plan(Long hostId,Long deptId,Long planType,Long userId,Long orderId,Long cstmrId,String uuid,String name,Date appleTime,Long planNeed,Integer beItem,String planner,Date finishTime,String form,Integer change,Integer changeTime,String changeReason,Double planBonus,Double planLeaderBonus,String files,Integer settle,String settleMsg,String comment,Integer status,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
+        this.hostId = hostId;
+        this.deptId = deptId;
+        this.planType = planType;
+        this.userId = userId;
+        this.orderId = orderId;
+        this.cstmrId = cstmrId;
+        this.uuid = uuid;
+        this.name = name;
+        this.appleTime = appleTime;
+        this.planNeed = planNeed;
+        this.beItem = beItem;
+        this.planner = planner;
+        this.finishTime = finishTime;
+        this.form = form;
+        this.change = change;
+        this.changeTime = changeTime;
+        this.changeReason = changeReason;
+        this.planBonus = planBonus;
+        this.planLeaderBonus = planLeaderBonus;
+        this.files = files;
+        this.settle = settle;
+        this.settleMsg = settleMsg;
+        this.comment = comment;
+        this.status = status;
+        this.createBy = createBy;
+        this.createTime = createTime;
+        this.updateBy = updateBy;
+        this.updateTime = updateTime;
+        this.memo = memo;
+    }
+
+//    Plan plan = new Plan(
+//            null,    // 鎵�灞炲晢鎴�
+//            null,    // 鎵�灞為儴闂�
+//            null,    // 涓氬姟绫诲瀷[闈炵┖]
+//            null,    // 涓氬姟鍛�
+//            null,    // 璺熻釜椤圭洰
+//            null,    // 鐢叉柟鍗曚綅
+//            null,    // 瑙勫垝鍗曚唬鍙穂闈炵┖]
+//            null,    // 瑙勫垝鍗曞悕绉癧闈炵┖]
+//            null,    // 鐢宠鏃ユ湡
+//            null,    // 鏂规鎵�闇�
+//            null,    // 绔嬮」
+//            null,    // 瑙勫垝鍛�
+//            null,    // 瀹屾垚鏃堕棿
+//            null,    // 琛ㄥ崟鍐呭
+//            null,    // 鏇存敼鏂规
+//            null,    // 鏇存敼娆℃暟
+//            null,    // 鏇存敼鏂规鍘熷洜
+//            null,    // 瑙勬牸濂栭噾
+//            null,    // 瑙勬牸缁勯暱濂栭噾
+//            null,    // 闄勪欢
+//            null,    // 杩涘害
+//            null,    // 瀹℃牳杩涘害
+//            null,    // 璇勮
+//            null,    // 鐘舵��
+//            null,    // 娣诲姞浜哄憳
+//            null,    // 娣诲姞鏃堕棿
+//            null,    // 淇敼浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null    // 娉ㄩ噴
+//    );
+
+    public String getHostId$(){
+        HostService service = SpringUtils.getBean(HostService.class);
+        Host host = service.selectById(this.hostId);
+        if (!Cools.isEmpty(host)){
+            return String.valueOf(host.getName());
+        }
+        return null;
+    }
+
+    public String getDeptId$(){
+        DeptService service = SpringUtils.getBean(DeptService.class);
+        Dept dept = service.selectById(this.deptId);
+        if (!Cools.isEmpty(dept)){
+            return String.valueOf(dept.getName());
+        }
+        return null;
+    }
+
+    public String getPlanType$(){
+        PlanTypeService service = SpringUtils.getBean(PlanTypeService.class);
+        PlanType planType = service.selectById(this.planType);
+        if (!Cools.isEmpty(planType)){
+            return String.valueOf(planType.getName());
+        }
+        return null;
+    }
+
+    public String getUserId$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.userId);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+    public String getOrderId$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.orderId);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+    public String getCstmrId$(){
+        CstmrService service = SpringUtils.getBean(CstmrService.class);
+        Cstmr cstmr = service.selectById(this.cstmrId);
+        if (!Cools.isEmpty(cstmr)){
+            return String.valueOf(cstmr.getName());
+        }
+        return null;
+    }
+
+    public String getAppleTime$(){
+        if (Cools.isEmpty(this.appleTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.appleTime);
+    }
+
+    public String getPlanNeed$(){
+        PlanNeedService service = SpringUtils.getBean(PlanNeedService.class);
+        PlanNeed planNeed = service.selectById(this.planNeed);
+        if (!Cools.isEmpty(planNeed)){
+            return String.valueOf(planNeed.getName());
+        }
+        return null;
+    }
+
+    public String getBeItem$(){
+        if (null == this.beItem){ return null; }
+        switch (this.beItem){
+            case 1:
+                return "鏄�";
+            case 0:
+                return "鍚�";
+            default:
+                return String.valueOf(this.beItem);
+        }
+    }
+
+    public String getFinishTime$(){
+        if (Cools.isEmpty(this.finishTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.finishTime);
+    }
+
+    public String getChange$(){
+        if (null == this.change){ return null; }
+        switch (this.change){
+            case 1:
+                return "鏄�";
+            case 0:
+                return "鍚�";
+            default:
+                return String.valueOf(this.change);
+        }
+    }
+
+    public String getSettle$(){
+        if (null == this.settle){ return null; }
+        switch (this.settle){
+            case 1:
+                return "寮�濮�";
+            case 2:
+                return "缁勯暱寰呭";
+            case 3:
+                return "缁勯暱瀹℃牳";
+            case 4:
+                return "瑙勫垝寰呭";
+            case 5:
+                return "瑙勫垝瀹℃牳";
+            case 6:
+                return "瀹℃壒涓�";
+            case 7:
+                return "瀹℃壒閫氳繃";
+            default:
+                return String.valueOf(this.settle);
+        }
+    }
+
+    public String getStatus$(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return "姝e父";
+            case 0:
+                return "绂佺敤";
+            default:
+                return String.valueOf(this.status);
+        }
+    }
+
+    public String getCreateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.createBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.updateBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+
+}
diff --git a/src/main/java/com/zy/crm/manager/mapper/PlanMapper.java b/src/main/java/com/zy/crm/manager/mapper/PlanMapper.java
new file mode 100644
index 0000000..bbd587a
--- /dev/null
+++ b/src/main/java/com/zy/crm/manager/mapper/PlanMapper.java
@@ -0,0 +1,12 @@
+package com.zy.crm.manager.mapper;
+
+import com.zy.crm.manager.entity.Plan;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface PlanMapper extends BaseMapper<Plan> {
+
+}
diff --git a/src/main/java/com/zy/crm/manager/service/PlanService.java b/src/main/java/com/zy/crm/manager/service/PlanService.java
new file mode 100644
index 0000000..cf0f278
--- /dev/null
+++ b/src/main/java/com/zy/crm/manager/service/PlanService.java
@@ -0,0 +1,8 @@
+package com.zy.crm.manager.service;
+
+import com.zy.crm.manager.entity.Plan;
+import com.baomidou.mybatisplus.service.IService;
+
+public interface PlanService extends IService<Plan> {
+
+}
diff --git a/src/main/java/com/zy/crm/manager/service/impl/PlanServiceImpl.java b/src/main/java/com/zy/crm/manager/service/impl/PlanServiceImpl.java
new file mode 100644
index 0000000..d9cae79
--- /dev/null
+++ b/src/main/java/com/zy/crm/manager/service/impl/PlanServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.crm.manager.service.impl;
+
+import com.zy.crm.manager.mapper.PlanMapper;
+import com.zy.crm.manager.entity.Plan;
+import com.zy.crm.manager.service.PlanService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("planService")
+public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements PlanService {
+
+}
diff --git a/src/main/resources/mapper/PlanMapper.xml b/src/main/resources/mapper/PlanMapper.xml
new file mode 100644
index 0000000..be12701
--- /dev/null
+++ b/src/main/resources/mapper/PlanMapper.xml
@@ -0,0 +1,40 @@
+<?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.PlanMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.crm.manager.entity.Plan">
+        <id column="id" property="id" />
+        <result column="host_id" property="hostId" />
+        <result column="dept_id" property="deptId" />
+        <result column="plan_type" property="planType" />
+        <result column="user_id" property="userId" />
+        <result column="order_id" property="orderId" />
+        <result column="cstmr_id" property="cstmrId" />
+        <result column="uuid" property="uuid" />
+        <result column="name" property="name" />
+        <result column="apple_time" property="appleTime" />
+        <result column="plan_need" property="planNeed" />
+        <result column="be_item" property="beItem" />
+        <result column="planner" property="planner" />
+        <result column="finish_time" property="finishTime" />
+        <result column="form" property="form" />
+        <result column="change" property="change" />
+        <result column="change_time" property="changeTime" />
+        <result column="change_reason" property="changeReason" />
+        <result column="plan_bonus" property="planBonus" />
+        <result column="plan_leader_bonus" property="planLeaderBonus" />
+        <result column="files" property="files" />
+        <result column="settle" property="settle" />
+        <result column="settle_msg" property="settleMsg" />
+        <result column="comment" property="comment" />
+        <result column="status" property="status" />
+        <result column="create_by" property="createBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="memo" property="memo" />
+
+    </resultMap>
+
+</mapper>
diff --git a/src/main/webapp/static/js/plan/plan.js b/src/main/webapp/static/js/plan/plan.js
new file mode 100644
index 0000000..12a46b3
--- /dev/null
+++ b/src/main/webapp/static/js/plan/plan.js
@@ -0,0 +1,554 @@
+var pageCurr;
+var pageCount = 0;
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).use(['table','laydate', 'form', 'admin', 'xmSelect'], function(){
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+    var admin = layui.admin;
+    var xmSelect = layui.xmSelect;
+
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#plan',
+        headers: {token: localStorage.getItem('token')},
+        url: baseUrl+'/plan/list/auth',
+        page: true,
+        limit: 15,
+        limits: [15, 30, 50, 100, 200, 500],
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        height: 'full-120',
+        cols: [[
+            {type: 'checkbox'}
+            ,{field: 'id', align: 'center',title: 'ID'}
+            ,{field: 'hostId$', align: 'center',title: '鎵�灞炲晢鎴�'}
+            ,{field: 'deptId$', align: 'center',title: '鎵�灞為儴闂�'}
+            ,{field: 'planType$', align: 'center',title: '涓氬姟绫诲瀷'}
+            ,{field: 'userId$', align: 'center',title: '涓氬姟鍛�'}
+            ,{field: 'orderId$', align: 'center',title: '璺熻釜椤圭洰'}
+            ,{field: 'cstmrId$', align: 'center',title: '鐢叉柟鍗曚綅'}
+            ,{field: 'uuid', align: 'center',title: '瑙勫垝鍗曚唬鍙�'}
+            ,{field: 'name', align: 'center',title: '瑙勫垝鍗曞悕绉�'}
+            ,{field: 'appleTime$', align: 'center',title: '鐢宠鏃ユ湡'}
+            ,{field: 'planNeed$', align: 'center',title: '鏂规鎵�闇�'}
+            ,{field: 'beItem$', align: 'center',title: '绔嬮」'}
+            ,{field: 'planner', align: 'center',title: '瑙勫垝鍛�'}
+            ,{field: 'finishTime$', align: 'center',title: '瀹屾垚鏃堕棿'}
+            ,{field: 'form', align: 'center',title: '琛ㄥ崟鍐呭'}
+            ,{field: 'change$', align: 'center',title: '鏇存敼鏂规'}
+            ,{field: 'changeTime', align: 'center',title: '鏇存敼娆℃暟'}
+            ,{field: 'changeReason', align: 'center',title: '鏇存敼鏂规鍘熷洜'}
+            ,{field: 'planBonus', align: 'center',title: '瑙勬牸濂栭噾'}
+            ,{field: 'planLeaderBonus', align: 'center',title: '瑙勬牸缁勯暱濂栭噾'}
+            ,{field: 'files', align: 'center',title: '闄勪欢'}
+            ,{field: 'settle$', align: 'center',title: '杩涘害'}
+            ,{field: 'settleMsg', align: 'center',title: '瀹℃牳杩涘害'}
+            ,{field: 'comment', align: 'center',title: '璇勮'}
+            ,{field: 'status$', align: 'center',title: '鐘舵��'}
+            ,{field: 'createBy$', align: 'center',title: '娣诲姞浜哄憳'}
+            ,{field: 'createTime$', align: 'center',title: '娣诲姞鏃堕棿'}
+            ,{field: 'updateBy$', align: 'center',title: '淇敼浜哄憳'}
+            ,{field: 'updateTime$', 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(res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;pageCount=count;
+            limit();
+        }
+    });
+
+    // 鐩戝惉鎺掑簭浜嬩欢
+    table.on('sort(plan)', 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}
+        });
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(plan)', function (obj) {
+        var checkStatus = table.checkStatus(obj.config.id).data;
+        switch(obj.event) {
+            case 'addData':
+                showEditModel();
+                break;
+            case 'deleteData':
+               if (checkStatus.length === 0) {
+                   layer.msg('璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁', {icon: 2});
+                   return;
+               }
+               del(checkStatus.map(function (d) {
+                   return d.id;
+               }));
+               break;
+            case 'exportData':
+                admin.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 = {
+                        'plan': exportData,
+                        'fields': fields
+                    };
+                    $.ajax({
+                        url: baseUrl+"/plan/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, {icon: 2})
+                            }
+                        }
+                    });
+                });
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(plan)', function(obj){
+        var data = obj.data;
+        switch (obj.event) {
+            case 'edit':
+                showEditModel(data);
+                break;
+            case "del":
+                del([data.id]);
+                break;
+        }
+    });
+
+    /* 寮圭獥 - 鏂板銆佷慨鏀� */
+    function showEditModel(mData) {
+        admin.open({
+            type: 1,
+            area: '600px',
+            title: (mData ? '淇敼' : '娣诲姞') + '',
+            content: $('#editDialog').html(),
+            success: function (layero, dIndex) {
+                layDateRender(mData);
+                form.val('detail', mData);
+                form.on('submit(editSubmit)', function (data) {
+                    var loadIndex = layer.load(2);
+                    $.ajax({
+                        url: baseUrl+"/plan/"+(mData?'update':'add')+"/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: data.field,
+                        method: 'POST',
+                        success: function (res) {
+                            layer.close(loadIndex);
+                            if (res.code === 200){
+                                layer.close(dIndex);
+                                layer.msg(res.msg, {icon: 1});
+                                tableReload();
+                            } else if (res.code === 403){
+                                top.location.href = baseUrl+"/";
+                            }else {
+                                layer.msg(res.msg, {icon: 2});
+                            }
+                        }
+                    })
+                    return false;
+                });
+                $(layero).children('.layui-layer-content').css('overflow', 'visible');
+                layui.form.render('select');
+            }
+        });
+    }
+
+    /* 鍒犻櫎 */
+    function del(ids) {
+        layer.confirm('纭畾瑕佸垹闄ら�変腑鏁版嵁鍚楋紵', {
+            skin: 'layui-layer-admin',
+            shade: .1
+        }, function (i) {
+            layer.close(i);
+            var loadIndex = layer.load(2);
+            $.ajax({
+                url: baseUrl+"/plan/delete/auth",
+                headers: {'token': localStorage.getItem('token')},
+                data: {ids: ids},
+                method: 'POST',
+                success: function (res) {
+                    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});
+                    }
+                }
+            })
+        });
+    }
+
+    // 鎼滅储
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        tableReload();
+    });
+
+    // 閲嶇疆
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        tableReload();
+    });
+
+    // 鏃堕棿閫夋嫨鍣�
+    function layDateRender(data) {
+        setTimeout(function () {
+            layDate.render({
+                elem: '.layui-laydate-range'
+                ,type: 'datetime'
+                ,range: true
+            });
+            layDate.render({
+                elem: '#appleTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['appleTime\\$']:null
+            });
+            layDate.render({
+                elem: '#finishTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['finishTime\\$']:null
+            });
+            layDate.render({
+                elem: '#createTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['createTime\\$']:null
+            });
+            layDate.render({
+                elem: '#updateTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['updateTime\\$']:null
+            });
+
+        }, 300);
+    }
+    layDateRender();
+
+    window.loadHostSel = function () {
+        return xmSelect.render({
+            el: '#hostXmlSel',
+            autoRow: true,
+            filterable: true,
+            remoteSearch: true,
+            radio: true,
+            remoteMethod: function (val, cb, show) {
+                $.ajax({
+                    url: baseUrl + "/host/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});
+                        }
+                    }
+                });
+            }
+        });
+    }
+
+    window.loadDeptSel = function () {
+        return xmSelect.render({
+            el: '#deptXmlSel',
+            autoRow: true,
+            filterable: true,
+            remoteSearch: true,
+            radio: true,
+            remoteMethod: function (val, cb, show) {
+                $.ajax({
+                    url: baseUrl + "/dept/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});
+                        }
+                    }
+                });
+            }
+        });
+    }
+
+    window.loadPlanTypeSel = function () {
+        return xmSelect.render({
+            el: '#planTypeXmlSel',
+            autoRow: true,
+            filterable: true,
+            remoteSearch: true,
+            radio: true,
+            remoteMethod: function (val, cb, show) {
+                $.ajax({
+                    url: baseUrl + "/planType/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});
+                        }
+                    }
+                });
+            }
+        });
+    }
+
+    window.loadUserSel = function () {
+        return xmSelect.render({
+            el: '#userXmlSel',
+            autoRow: true,
+            filterable: true,
+            remoteSearch: true,
+            radio: true,
+            remoteMethod: function (val, cb, show) {
+                $.ajax({
+                    url: baseUrl + "/user/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});
+                        }
+                    }
+                });
+            }
+        });
+    }
+
+    window.loadUserSel = function () {
+        return xmSelect.render({
+            el: '#userXmlSel',
+            autoRow: true,
+            filterable: true,
+            remoteSearch: true,
+            radio: true,
+            remoteMethod: function (val, cb, show) {
+                $.ajax({
+                    url: baseUrl + "/user/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});
+                        }
+                    }
+                });
+            }
+        });
+    }
+
+    window.loadCstmrSel = function () {
+        return xmSelect.render({
+            el: '#cstmrXmlSel',
+            autoRow: true,
+            filterable: true,
+            remoteSearch: true,
+            radio: true,
+            remoteMethod: function (val, cb, show) {
+                $.ajax({
+                    url: baseUrl + "/cstmr/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});
+                        }
+                    }
+                });
+            }
+        });
+    }
+
+    window.loadPlanNeedSel = function () {
+        return xmSelect.render({
+            el: '#planNeedXmlSel',
+            autoRow: true,
+            filterable: true,
+            remoteSearch: true,
+            radio: true,
+            remoteMethod: function (val, cb, show) {
+                $.ajax({
+                    url: baseUrl + "/planNeed/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});
+                        }
+                    }
+                });
+            }
+        });
+    }
+
+    window.loadUserSel = function () {
+        return xmSelect.render({
+            el: '#userXmlSel',
+            autoRow: true,
+            filterable: true,
+            remoteSearch: true,
+            radio: true,
+            remoteMethod: function (val, cb, show) {
+                $.ajax({
+                    url: baseUrl + "/user/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});
+                        }
+                    }
+                });
+            }
+        });
+    }
+
+    window.loadUserSel = function () {
+        return xmSelect.render({
+            el: '#userXmlSel',
+            autoRow: true,
+            filterable: true,
+            remoteSearch: true,
+            radio: true,
+            remoteMethod: function (val, cb, show) {
+                $.ajax({
+                    url: baseUrl + "/user/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});
+                        }
+                    }
+                });
+            }
+        });
+    }
+
+
+
+});
+
+// 鍏抽棴鍔ㄤ綔
+$(document).on('click','#data-detail-close', function () {
+    parent.layer.closeAll();
+});
+
+function tableReload() {
+    if (pageCount === 0) {
+        let searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function() {
+            searchData[this.name] = this.value;
+        });
+        tableIns.reload({
+            where: searchData,
+            page: {curr: pageCurr}
+        });
+    } else {
+        $(".layui-laypage-btn")[0].click();
+    }
+}
diff --git a/src/main/webapp/views/plan/plan.html b/src/main/webapp/views/plan/plan.html
new file mode 100644
index 0000000..81556e8
--- /dev/null
+++ b/src/main/webapp/views/plan/plan.html
@@ -0,0 +1,335 @@
+<!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">
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body">
+            <div class="layui-form toolbar" id="search-box">
+                <div class="layui-form-item">
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="id" placeholder="缂栧彿" autocomplete="off">
+                        </div>
+                    </div>
+                     <div class="layui-inline" style="width: 300px">
+                        <div class="layui-input-inline">
+                            <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="璧峰鏃堕棿 - 缁堟鏃堕棿" autocomplete="off" style="width: 300px">
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="condition" placeholder="璇疯緭鍏�" autocomplete="off">
+                        </div>
+                    </div>
+                    <div class="layui-inline">&emsp;
+                        <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
+                            <i class="layui-icon">&#xe615;</i>鎼滅储
+                        </button>
+                        <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
+                            <i class="layui-icon">&#xe666;</i>閲嶇疆
+                        </button>
+                    </div>
+                </div>
+            </div>
+            <table class="layui-hide" id="plan" lay-filter="plan"></table>
+        </div>
+    </div>
+</div>
+
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">鏂板</button>
+        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">鍒犻櫎</button>
+        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">瀵煎嚭</button>
+    </div>
+</script>
+
+<script type="text/html" id="operate">
+    <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/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/plan/plan.js" charset="utf-8"></script>
+</body>
+<!-- 琛ㄥ崟寮圭獥 -->
+<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">鎵�灞炲晢鎴�: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="hostId" placeholder="璇疯緭鍏ユ墍灞炲晢鎴�" style="display: none">
+                        <input id="hostId$" name="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">鎵�灞為儴闂�: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="deptId" placeholder="璇疯緭鍏ユ墍灞為儴闂�" style="display: none">
+                        <input id="deptId$" name="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 layui-form-required">涓氬姟绫诲瀷: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="planType" placeholder="璇疯緭鍏ヤ笟鍔$被鍨�" lay-vertype="tips" lay-verify="required" style="display: none">
+                        <input id="planType$" name="planType$" 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="planTypeQueryByplanType" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                            <select class="cool-auto-complete-window-select" data-key="planTypeQueryByplanTypeSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">涓氬姟鍛�: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="userId" placeholder="璇疯緭鍏ヤ笟鍔″憳" style="display: none">
+                        <input id="userId$" name="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">璺熻釜椤圭洰: </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="userQueryByorderId" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                            <select class="cool-auto-complete-window-select" data-key="userQueryByorderIdSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鐢叉柟鍗曚綅: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="cstmrId" placeholder="璇疯緭鍏ョ敳鏂瑰崟浣�" style="display: none">
+                        <input id="cstmrId$" name="cstmrId$" 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="cstmrQueryBycstmrId" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                            <select class="cool-auto-complete-window-select" data-key="cstmrQueryBycstmrIdSelect" 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="uuid" placeholder="璇疯緭鍏ヨ鍒掑崟浠e彿" 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="name" 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="appleTime" id="appleTime$" placeholder="璇疯緭鍏ョ敵璇锋棩鏈�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鏂规鎵�闇�: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="planNeed" placeholder="璇疯緭鍏ユ柟妗堟墍闇�" style="display: none">
+                        <input id="planNeed$" name="planNeed$" 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="planNeedQueryByplanNeed" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                            <select class="cool-auto-complete-window-select" data-key="planNeedQueryByplanNeedSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">绔嬮」: </label>
+                    <div class="layui-input-block">
+                        <select name="beItem">
+                            <option value="">璇烽�夋嫨绔嬮」</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">
+                        <input class="layui-input" name="planner" placeholder="璇疯緭鍏ヨ鍒掑憳">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">瀹屾垚鏃堕棿: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="finishTime" id="finishTime$" placeholder="璇疯緭鍏ュ畬鎴愭椂闂�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">琛ㄥ崟鍐呭: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="form" placeholder="璇疯緭鍏ヨ〃鍗曞唴瀹�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鏇存敼鏂规: </label>
+                    <div class="layui-input-block">
+                        <select name="change">
+                            <option value="">璇烽�夋嫨鏇存敼鏂规</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">
+                        <input class="layui-input" name="changeTime" placeholder="璇疯緭鍏ユ洿鏀规鏁�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鏇存敼鏂规鍘熷洜: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="changeReason" placeholder="璇疯緭鍏ユ洿鏀规柟妗堝師鍥�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">瑙勬牸濂栭噾: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="planBonus" placeholder="璇疯緭鍏ヨ鏍煎閲�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">瑙勬牸缁勯暱濂栭噾: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="planLeaderBonus" placeholder="璇疯緭鍏ヨ鏍肩粍闀垮閲�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">闄勪欢: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="files" placeholder="璇疯緭鍏ラ檮浠�">
+                    </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="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">鐘舵��: </label>
+                    <div class="layui-input-block">
+                        <select name="status">
+                            <option value="">璇烽�夋嫨鐘舵��</option>
+                            <option value="1">姝e父</option>
+                            <option value="0">绂佺敤</option>
+                        </select>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">娣诲姞浜哄憳: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="createBy" placeholder="璇疯緭鍏ユ坊鍔犱汉鍛�" style="display: none">
+                        <input id="createBy$" name="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">娣诲姞鏃堕棿: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="createTime" id="createTime$" placeholder="璇疯緭鍏ユ坊鍔犳椂闂�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">淇敼浜哄憳: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="updateBy" placeholder="璇疯緭鍏ヤ慨鏀逛汉鍛�" style="display: none">
+                        <input id="updateBy$" name="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">淇敼鏃堕棿: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="updateTime" id="updateTime$" placeholder="璇疯緭鍏ヤ慨鏀规椂闂�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">娉ㄩ噴: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="memo" placeholder="璇疯緭鍏ユ敞閲�">
+                    </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>
+</html>
+

--
Gitblit v1.9.1