中扬CRM客户关系管理系统
Junjie
2023-09-14 2a8710c50e2f7c4dd0e333dcf650a2dff960fff4
Merge remote-tracking branch 'origin/zycrm' into zycrm
37个文件已修改
5个文件已添加
2963 ■■■■■ 已修改文件
src/main/java/com/zy/crm/common/model/SettleDto.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/controller/ContractController.java 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/controller/CstmrController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/controller/OrderController.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/controller/PlanController.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/controller/PriOnline2Controller.java 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/controller/PriOnlineController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/controller/PriQuoteBudgetController.java 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/controller/PriQuoteController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/controller/PriSalesController.java 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/controller/ReimburseOnlineController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/entity/Contract.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/entity/PriOnline2.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/entity/PriQuote.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/entity/PriQuoteBudget.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/entity/PriSales.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/entity/ProcessPermissions.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/entity/ReimburseOnline.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/service/impl/OrderServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/service/impl/PlanServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/ContractMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/PriOnline2Mapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/PriSalesMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/common.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/contract/contract.js 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/order/order.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/priOnline2/priOnline.js 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/priQuote/priQuote.js 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/priQuoteBudget/priQuoteBudget.js 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/priSales/priSales.js 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/reimburseOnline/reimburseOnline.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/businessTrip/businessTrip.html 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/contract/contract.html 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/contract/contract_more.html 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/plan/plan_more_other.html 511 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/priOnline2/priOnline.html 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/priOnline2/priOnline_more.html 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/priQuoteBudget/priQuoteBudget.html 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/priQuoteBudget/priQuoteBudget_more.html 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/priSales/priSales.html 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/priSales/priSales_more.html 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/processPermissions/processPermissions.html 59 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/common/model/SettleDto.java
@@ -74,7 +74,7 @@
    public static List<SettleDto> initPriQuote(Plan plan, User manager ,User president,User user) {
        List<SettleDto> list = new ArrayList<>();
        for (int i = 1; i < 6; i++) {
        for (int i = 1; i < 5; i++) {
            SettleDto dto = new SettleDto();
            dto.setStep(i);
            switch (i) {
@@ -180,7 +180,7 @@
    public static List<SettleDto> initBusiness(User manager ,User user) {
        List<SettleDto> list = new ArrayList<>();
        for (int i = 0; i < 7; i++) {
        for (int i = 0; i < 3; i++) {
            SettleDto dto = new SettleDto();
            dto.setStep(i);
            switch (i) {
@@ -205,4 +205,87 @@
        return list;
    }
    public static List<SettleDto> initSalesPricing(User manager ,User user,List<String> names ,int nodes) {
        List<SettleDto> list = new ArrayList<>();
        for (int i = 0; i < nodes+1; i++) {
            SettleDto dto = new SettleDto();
            dto.setStep(i);
            switch (i) {
                case 0:
                    dto.setTitle("开始");
                    dto.setMsg(user.getUsername() + names.get(i));
                    dto.setUserId(user.getId());
                    dto.setUsername(user.getUsername());
                    dto.setTime(DateUtils.convert(new Date()));
                    dto.setCurr(Boolean.TRUE);
                    list.add(dto);
                    break;
                case 1:
                    dto.setTitle(names.get(i));
                    dto.setUserId(user.getId());
                    dto.setUsername(user.getNickname());
                    list.add(dto);
                    break;
                case 2:
                    dto.setTitle(names.get(i));
                    dto.setUserId(manager.getId());
                    dto.setUsername(manager.getNickname());
                    list.add(dto);
                    break;
                case 3:
                    dto.setTitle(names.get(i));
                    list.add(dto);
                    break;
                default:
                    break;
            }
        }
        return list;
    }
    public static List<SettleDto> initContract(User manager ,User user,User president,List<String> names ,int nodes) {
        List<SettleDto> list = new ArrayList<>();
        for (int i = 0; i < nodes+1; i++) {
            SettleDto dto = new SettleDto();
            dto.setStep(i);
            switch (i) {
                case 0:
                    dto.setTitle("开始");
                    dto.setMsg(user.getUsername() + names.get(i));
                    dto.setUserId(user.getId());
                    dto.setUsername(user.getUsername());
                    dto.setTime(DateUtils.convert(new Date()));
                    dto.setCurr(Boolean.TRUE);
                    list.add(dto);
                    break;
                case 1:
                    dto.setTitle(names.get(i));
                    dto.setUserId(user.getId());
                    dto.setUsername(user.getNickname());
                    list.add(dto);
                    break;
                case 2:
                    dto.setTitle(names.get(i));
                    dto.setUserId(manager.getId());
                    dto.setUsername(manager.getNickname());
                    list.add(dto);
                    break;
                case 3:
                    dto.setTitle(names.get(i));
                    dto.setUserId(president.getId());
                    dto.setUsername(president.getNickname());
                    list.add(dto);
                    break;
                case 4:
                    dto.setTitle(names.get(i));
                    list.add(dto);
                    break;
                default:
                    break;
            }
        }
        return list;
    }
}
src/main/java/com/zy/crm/manager/controller/ContractController.java
@@ -1,15 +1,16 @@
package com.zy.crm.manager.controller;
import com.alibaba.fastjson.JSON;
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.core.exception.CoolException;
import com.zy.crm.common.model.SettleDto;
import com.zy.crm.common.service.OssService;
import com.zy.crm.manager.entity.Contract;
import com.zy.crm.manager.entity.ContractSales;
import com.zy.crm.manager.entity.PriOnline;
import com.zy.crm.manager.entity.*;
import com.zy.crm.manager.service.ContractSalesService;
import com.zy.crm.manager.service.ContractService;
import com.core.annotations.ManagerAuth;
@@ -18,8 +19,11 @@
import com.core.common.R;
import com.core.domain.KeyValueVo;
import com.zy.crm.common.web.BaseController;
import com.zy.crm.manager.service.ProcessPermissionsService;
import com.zy.crm.manager.utils.ChineseNumberUtils;
import com.zy.crm.manager.utils.WordUtils;
import com.zy.crm.system.entity.User;
import com.zy.crm.system.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
@@ -44,11 +48,20 @@
    private ContractSalesService contractSalesService;
    @Autowired
    private OssService ossService;
    @Autowired
    private UserService userService;
    @Autowired
    private ProcessPermissionsService processPermissionsService;
    @RequestMapping(value = "/contract/{id}/auth")
    @ManagerAuth
    public R get(@PathVariable("id") String id) {
        return R.ok(contractService.selectById(String.valueOf(id)));
        Contract contract = contractService.selectById(String.valueOf(id));
        assert contract != null;
        JSONObject resultObj = JSON.parseObject(JSON.toJSONString(contract));
        // 步骤条相关
        resultObj.put("step", contract.getSettle() == 5 ? 0 : contract.getSettle() + 1);
        return R.ok().add(resultObj);
    }
    @RequestMapping(value = "/contract/list/auth")
@@ -68,25 +81,66 @@
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        boolean signUserId = false;
        boolean signDeptId = false;
        boolean signHostId = false;
        for (Map.Entry<String, Object> entry : map.entrySet()){
            if (entry.getKey().equals("dept_id")){
                signDeptId = true;
                if (String.valueOf(entry.getValue()).equals("19")){
                    signHostId = true;
                }
            }
        }
        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 if (entry.getKey().equals("dept_id")){
                if (!val.equals("19")){
                    wrapper.eq(entry.getKey(), val);
                }
            } else if (entry.getKey().equals("user_id") && !signDeptId){
                signUserId = true;
                wrapper.eq(entry.getKey(), val);
            } else {
                wrapper.like(entry.getKey(), val);
            }
        }
        if (!signUserId && !signDeptId){
            wrapper.eq("user_id", getUserId());
        }
        if (signHostId){
            wrapper.or().eq("host_id",1);
        }
    }
    @RequestMapping(value = "/contract/add/auth")
    @ManagerAuth(memo = "添加合同")
    public R add(Contract contract) {
        Date now = new Date();
        contract.setUserId(getUserId());
        //创建人员部门
        contract.setDeptId(getDeptId());
        contract.setCreateTime(new Date());
        contract.setCreateTime(now);
        contract.setSettle(0);
        User manager = userService.getDeptManager(getHostId(), getUser().getDeptId());        // 获取部门领导
        List<String> initNames = new ArrayList<>();
        initNames.add("创建产品费用明细模板");
        initNames.add("提交产品费用明细");
        initNames.add("部门经理审核");
        ProcessPermissions processPermissions = processPermissionsService.selectOne(new EntityWrapper<ProcessPermissions>().eq("process_memo", 7).eq("process",  "3-1" ));//7:合同管理
        User president = userService.selectById(processPermissions.getUserId());
        initNames.add("总裁办"+president.getNickname()+"审核");
        initNames.add("业务员确认");
        contract.setSettleMsg(JSON.toJSONString(SettleDto.initContract(manager,getUser(),president,initNames,4)));
        contract.setUpdateTime(now);
        contract.setUpdateBy(getUserId());
        contractService.insert(contract);
        return R.ok();
    }
@@ -296,4 +350,152 @@
        return R.ok().add(vos);
    }
    @PostMapping(value = "/contracr/approval/auth")
    @ManagerAuth
    public R approvalBusinessTrip(@RequestParam Long contracrId,
                                  @RequestParam(required = false) Long plannerId){
        Contract contract = contractService.selectById(contracrId);
        assert contract != null;
        Date now = new Date();
        switch (contract.getSettle()) {
            case 0:
                User user2 = userService.selectById(contract.getUserId());
                User manager1 = userService.getDeptManager(getHostId(), user2.getDeptId());
                if (Cools.isEmpty(getUser())) {
                    return R.error("抱歉,您没有提交的权限");
                }
                if (!getUserId().equals(getUser().getId())) {
                    return R.error("抱歉,您没有提交的权限");
                }
                // 修改 settle 步骤数据
                List<SettleDto> list1 = JSON.parseArray(contract.getSettleMsg(), SettleDto.class);
                for (SettleDto dto : list1) {
                    switch (dto.getStep()) {
                        case 0:
                            dto.setCurr(Boolean.FALSE);
                            break;
                        case 1:
                            dto.setCurr(Boolean.TRUE);
                            dto.setMsg(getUser().getNickname() + "提交完成");
                            dto.setTime(DateUtils.convert(now));
                            break;
                        default:
                            break;
                    }
                }
                contract.setSettleMsg(JSON.toJSONString(list1));
                // 修改规划单状态
                contract.setSettle(1);
                contract.setUpdateTime(now);
                if (!contractService.updateById(contract)) {
                    throw new CoolException("提交失败,请联系管理员");
                }
                break;
            case 1:
                // 本部门经理审核
                User user = userService.selectById(contract.getUserId());
                User manager = userService.getDeptManager(getHostId(), user.getDeptId());
                if (manager.getId().equals(getUserId())) {
                    // 修改 settle 步骤数据
                    List<SettleDto> list = JSON.parseArray(contract.getSettleMsg(), SettleDto.class);
                    for (SettleDto dto : list) {
                        switch (dto.getStep()) {
                            case 1:
                                dto.setCurr(Boolean.FALSE);
                                break;
                            case 2:
                                dto.setCurr(Boolean.TRUE);
                                dto.setMsg("部门经理" + manager.getNickname() + "审批通过");
                                dto.setTime(DateUtils.convert(now));
                                break;
                            default:
                                break;
                        }
                    }
                    contract.setSettleMsg(JSON.toJSONString(list));
                    // 修改规划单状态
                    contract.setSettle(2);  // 申请通过
                    contract.setUpdateTime(now);
                    if (!contractService.updateById(contract)) {
                        throw new CoolException("审核失败,请联系管理员");
                    }
                } else {
                    return R.error("抱歉,您没有审核的权限!!!");
                }
                break;
            case 2:
                ProcessPermissions processPermissions = processPermissionsService.selectOne(new EntityWrapper<ProcessPermissions>().eq("process_memo", 7).eq("process", "3-1"));//3:报销流程
                User planLeader = userService.selectById(processPermissions.getUserId());       // 获取合同管理流程节点确认人
                if (planLeader.getId().equals(getUserId())) {
                    // 修改 settle 步骤数据
                    List<SettleDto> list = JSON.parseArray(contract.getSettleMsg(), SettleDto.class);
                    for (SettleDto dto : list) {
                        switch (dto.getStep()) {
                            case 2:
                                dto.setCurr(Boolean.FALSE);
                                break;
                            case 3:
                                dto.setCurr(Boolean.TRUE);
                                dto.setMsg("总裁办" + planLeader.getNickname() + "审批通过");
                                dto.setTime(DateUtils.convert(now));
                                break;
                            default:
                                break;
                        }
                    }
                    contract.setSettleMsg(JSON.toJSONString(list));
                    // 修改规划单状态
                    contract.setSettle(3);  // 申请通过
                    contract.setUpdateTime(now);
                    if (!contractService.updateById(contract)) {
                        throw new CoolException("审核失败,请联系管理员");
                    }
                } else {
                    return R.error("抱歉,您没有审核的权限!!!");
                }
                break;
            case 3:
                // 业务员
                User salesman0 = userService.selectById(contract.getUserId());
                if (!getUserId().equals(salesman0.getId())) {
                    return R.error("抱歉,您无需确认!!!");
                }
                // 修改 settle 步骤数据
                List<SettleDto> list2 = JSON.parseArray(contract.getSettleMsg(), SettleDto.class);
                for (SettleDto dto : list2) {
                    switch (dto.getStep()) {
                        case 3:
                            dto.setCurr(Boolean.TRUE);
                            break;
                        case 4:
                            dto.setCurr(Boolean.TRUE);
                            dto.setMsg("业务员" + salesman0.getNickname() + "以确认");
                            dto.setTime(DateUtils.convert(new Date()));
                            break;
                        default:
                            break;
                    }
                }
                contract.setSettleMsg(JSON.toJSONString(list2));
                // 修改规划单状态
                contract.setSettle(4);  // 审批通过
                contract.setUpdateTime(new Date());
                if (!contractService.updateById(contract)) {
                    throw new CoolException("确认失败,请联系管理员");
                }
                break;
            default:
                return R.error();
        }
        return R.ok("审批成功");
    }
}
src/main/java/com/zy/crm/manager/controller/CstmrController.java
@@ -153,9 +153,9 @@
    @ManagerAuth(memo = "删除甲方单位")
    public R delete(@RequestParam(value="ids[]") Long[] ids){
        for (Long id : ids){
            int cstmr_id = orderService.selectCount(new EntityWrapper<Order>().eq("cstmr_id", id));
            if (cstmr_id!=0){
                return R.error("存在关联跟踪项目,禁止删除!!!");
            int order = orderService.selectCount(new EntityWrapper<Order>().eq("cstmr_id", id));
            if (order!=0){
                return R.error("存在关联的跟踪项目,禁止删除!!!");
            }
            cstmrService.deleteById(id);
        }
src/main/java/com/zy/crm/manager/controller/OrderController.java
@@ -15,8 +15,10 @@
import com.zy.crm.manager.entity.CstmrFoll;
import com.zy.crm.manager.entity.Order;
import com.zy.crm.manager.entity.OrderFoll;
import com.zy.crm.manager.entity.Plan;
import com.zy.crm.manager.service.OrderFollService;
import com.zy.crm.manager.service.OrderService;
import com.zy.crm.manager.service.PlanService;
import com.zy.crm.system.entity.Role;
import com.zy.crm.system.entity.User;
import com.zy.crm.system.service.UserService;
@@ -40,6 +42,8 @@
    @Autowired
    private OrderService orderService;
    @Autowired
    private PlanService planService;
    @RequestMapping(value = "/order/{id}/auth")
    @ManagerAuth
@@ -91,6 +95,13 @@
        return R.ok();
    }
    @RequestMapping(value = "/order/userName/userId/auth")
    @ManagerAuth(memo = "添加跟踪项目获取当前登录账号信息")
    public R userNameAndUserId() {
        KeyValueVo keyValueVo = new KeyValueVo(getUser().getNickname(),getUserId());
        return R.ok().add(keyValueVo);
    }
    @RequestMapping(value = "/order/update/auth")
    @ManagerAuth(memo = "更新跟踪项目")
    public R update(Order order){
@@ -107,8 +118,12 @@
    @ManagerAuth(memo = "删除跟踪项目")
    public R delete(@RequestParam(value="ids[]") Long[] ids){
         for (Long id : ids){
             int plan = planService.selectCount(new EntityWrapper<Plan>().eq("order_id", id));
             if (plan!=0){
                 return R.error("存在关联的规划单,禁止删除!!!");
             }
            orderService.deleteById(id);
        }
         }
        return R.ok();
    }
src/main/java/com/zy/crm/manager/controller/PlanController.java
@@ -19,13 +19,8 @@
import com.zy.crm.common.utils.SetOfUtils;
import com.zy.crm.common.web.BaseController;
import com.zy.crm.manager.controller.result.FollowerTableVo;
import com.zy.crm.manager.entity.Order;
import com.zy.crm.manager.entity.Plan;
import com.zy.crm.manager.entity.PlanFoll;
import com.zy.crm.manager.entity.PlanType;
import com.zy.crm.manager.service.PlanFollService;
import com.zy.crm.manager.service.PlanService;
import com.zy.crm.manager.service.PlanTypeService;
import com.zy.crm.manager.entity.*;
import com.zy.crm.manager.service.*;
import com.zy.crm.system.entity.User;
import com.zy.crm.system.service.DeptService;
import com.zy.crm.system.service.UserService;
@@ -64,6 +59,8 @@
    private DeptService deptService;
    @Autowired
    private OssService ossService;
    @Autowired
    private PriOnline2Service priOnline2Service;
    @GetMapping(value = "/plan/{id}/auth")
    @ManagerAuth
@@ -215,7 +212,11 @@
    @ManagerAuth(memo = "删除规划申请单")
    public R delete(@RequestParam(value="ids[]") Long[] ids){
         for (Long id : ids){
            planService.deleteById(id);
             int priOnline2 = priOnline2Service.selectCount(new EntityWrapper<PriOnline2>().eq("item_id", id));
             if (priOnline2!=0){
                 return R.error("存在关联的核价单,禁止删除!!!");
             }
             planService.deleteById(id);
        }
        return R.ok();
    }
src/main/java/com/zy/crm/manager/controller/PriOnline2Controller.java
@@ -1,5 +1,6 @@
package com.zy.crm.manager.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
@@ -10,13 +11,13 @@
import com.core.common.DateUtils;
import com.core.common.R;
import com.core.domain.KeyValueVo;
import com.core.exception.CoolException;
import com.zy.crm.common.model.SettleDto;
import com.zy.crm.common.web.BaseController;
import com.zy.crm.manager.entity.Plan;
import com.zy.crm.manager.entity.Pri;
import com.zy.crm.manager.entity.PriOnline2;
import com.zy.crm.manager.service.PlanService;
import com.zy.crm.manager.service.PriOnline2Service;
import com.zy.crm.manager.service.PriService;
import com.zy.crm.manager.entity.*;
import com.zy.crm.manager.service.*;
import com.zy.crm.system.entity.User;
import com.zy.crm.system.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.ClassUtils;
@@ -40,10 +41,24 @@
    @Autowired
    private PlanService planService;
    @Autowired
    private PriSalesService priSalesService;
    @Autowired
    private CstmrService cstmrService;
    @Autowired
    private UserService userService;
    @RequestMapping(value = "/priOnline2/{id}/auth")
    @ManagerAuth
    public R get(@PathVariable("id") String id) {
        return R.ok(priOnline2Service.selectById(String.valueOf(id)));
        PriOnline2 priOnline2 = priOnline2Service.selectById(String.valueOf(id));
        assert priOnline2 != null;
        JSONObject resultObj = JSON.parseObject(JSON.toJSONString(priOnline2));
        // 步骤条相关
        resultObj.put("step", priOnline2.getSettle() == 4 ? 0 : priOnline2.getSettle() + 1);
        return R.ok().add(resultObj);
    }
    @RequestMapping(value = "/priOnline2/viewCheck/{id}/auth")
@@ -65,7 +80,7 @@
                  @RequestParam(required = false)String condition,
                  @RequestParam Map<String, Object> param){
        EntityWrapper<PriOnline2> wrapper = new EntityWrapper<>();
        wrapper.setSqlSelect("id,title,create_time as createTime,filepath,item_id as itemId,order_num as orderNum,template_name as templateName,user_id as userId,dept_id as deptId,status,update_time as updateTime,check_data as checkData,update_user_id as updateUserId,member_id as memberId");
        wrapper.setSqlSelect("id,title,create_time as createTime,filepath,settle,item_id as itemId,order_num as orderNum,template_name as templateName,user_id as userId,dept_id as deptId,status,update_time as updateTime,check_data as checkData,update_user_id as updateUserId,member_id as memberId");
        wrapper.in("member_id", getUserRoleBelongsToUserId("allopen"));
        excludeTrash(param);
        convert(param, wrapper);
@@ -111,7 +126,7 @@
        PriOnline2 priOnline2 = new PriOnline2();
        priOnline2.setCreateTime(new Date());
        priOnline2.setTitle(map.get("title").toString());
        priOnline2.setTemplateName(map.get("title").toString());
//        priOnline2.setTemplateName(map.get("title").toString());
        priOnline2.setSheetData(map.get("sheetData").toString());
        priOnline2.setItemId(Long.parseLong(map.get("itemId").toString()));
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
@@ -126,11 +141,24 @@
        priOnline2.setUpdateUserId(getUserId());
        //状态,未完成
        priOnline2.setStatus(0);
        //业务员
//        Item item = itemService.selectById(priOnline.getItemId());
        Plan plan = planService.selectById(priOnline2.getItemId());
        priOnline2.setMemberId(plan.getUserId());
        Cstmr cstmr = cstmrService.selectById(plan.getCstmrId());
        priOnline2.setTemplateName(cstmr.getName());  //甲方单位名称
        priOnline2.setSettle(0);
        User manager = userService.getDeptManager(getHostId(), getUser().getDeptId());        // 获取部门领导
        List<String> initNames = new ArrayList<>();
        initNames.add("创建核价单模板");
        initNames.add("提交核价");
        initNames.add("部门经理审核");
        initNames.add("业务员确认");
        priOnline2.setSettleMsg(JSON.toJSONString(SettleDto.initSalesPricing(manager,getUser(),initNames,3)));
        //设置项目流程
        plan.setStep(2);
@@ -277,6 +305,12 @@
        if (Cools.isEmpty(ids)){
            return R.error();
        }
        for (Long id : ids){
            int priSales = priSalesService.selectCount(new EntityWrapper<PriSales>().eq("pri_online2_id", id));
            if (priSales!=0){
                return R.error("存在关联的产品费用明细,禁止删除!!!");
            }
        }
        priOnline2Service.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
@@ -303,7 +337,8 @@
        for (PriOnline2 priOnline2 : page.getRecords()){
            Map<String, Object> map = new HashMap<>();
            map.put("id", priOnline2.getId());
            map.put("value", priOnline2.getOrderNum() + "/" + priOnline2.getPlanId$() + "/" + priOnline2.getMemberId$());
//            map.put("value", priOnline2.getOrderNum() + "/" + priOnline2.getPlanId$() + "/" + priOnline2.getMemberId$());
            map.put("value", priOnline2.getOrderNum() + "/" + priOnline2.getTemplateName());
            result.add(map);
        }
        return R.ok(result);
@@ -328,4 +363,120 @@
        return R.ok().add(vos);
    }
    @PostMapping(value = "/priOnline2/approval/auth")
    @ManagerAuth
    public R approvalBusinessTrip(@RequestParam Long priOnlineId,
                                  @RequestParam(required = false) Long plannerId){
        PriOnline2 priOnline2 = priOnline2Service.selectById(priOnlineId);
        assert priOnline2 != null;
        Date now = new Date();
        switch (priOnline2.getSettle()) {
            case 0:
                User user2 = userService.selectById(priOnline2.getUserId());
                User manager1 = userService.getDeptManager(getHostId(), user2.getDeptId());
                if (Cools.isEmpty(getUser())) {
                    return R.error("抱歉,您没有提交的权限");
                }
                if (!getUserId().equals(getUser().getId())) {
                    return R.error("抱歉,您没有提交的权限");
                }
                // 修改 settle 步骤数据
                List<SettleDto> list1 = JSON.parseArray(priOnline2.getSettleMsg(), SettleDto.class);
                for (SettleDto dto : list1) {
                    switch (dto.getStep()) {
                        case 0:
                            dto.setCurr(Boolean.FALSE);
                            break;
                        case 1:
                            dto.setCurr(Boolean.TRUE);
                            dto.setMsg(getUser().getNickname() + "提交完成");
                            dto.setTime(DateUtils.convert(now));
                            break;
                        default:
                            break;
                    }
                }
                priOnline2.setSettleMsg(JSON.toJSONString(list1));
                // 修改规划单状态
                priOnline2.setSettle(1);
                priOnline2.setUpdateUserId(getUserId());
                priOnline2.setUpdateTime(now);
                priOnline2.setMemberId(manager1.getId());
                if (!priOnline2Service.updateById(priOnline2)) {
                    throw new CoolException("提交失败,请联系管理员");
                }
                break;
            case 1:
                // 本部门经理审核
                User user = userService.selectById(priOnline2.getUserId());
                User manager = userService.getDeptManager(getHostId(), user.getDeptId());
                if (manager.getId().equals(getUserId())) {
                    // 修改 settle 步骤数据
                    List<SettleDto> list = JSON.parseArray(priOnline2.getSettleMsg(), SettleDto.class);
                    for (SettleDto dto : list) {
                        switch (dto.getStep()) {
                            case 1:
                                dto.setCurr(Boolean.FALSE);
                                break;
                            case 2:
                                dto.setCurr(Boolean.TRUE);
                                dto.setMsg("部门经理" + manager.getNickname() + "审批通过");
                                dto.setTime(DateUtils.convert(now));
                                break;
                            default:
                                break;
                        }
                    }
                    priOnline2.setSettleMsg(JSON.toJSONString(list));
                    // 修改规划单状态
                    priOnline2.setSettle(2);  // 申请通过
                    priOnline2.setUpdateTime(now);
                    if (!priOnline2Service.updateById(priOnline2)) {
                        throw new CoolException("审核失败,请联系管理员");
                    }
                } else {
                    return R.error("抱歉,您没有审核的权限!!!");
                }
                break;
            case 2:
                // 业务员
                User salesman0 = userService.selectById(priOnline2.getUserId());
                if (!getUserId().equals(salesman0.getId())) {
                    return R.error("抱歉,您无需确认!!!");
                }
                // 修改 settle 步骤数据
                List<SettleDto> list2 = JSON.parseArray(priOnline2.getSettleMsg(), SettleDto.class);
                for (SettleDto dto : list2) {
                    switch (dto.getStep()) {
                        case 2:
                            dto.setCurr(Boolean.TRUE);
                            break;
                        case 3:
                            dto.setCurr(Boolean.TRUE);
                            dto.setMsg("业务员" + salesman0.getNickname() + "以确认");
                            dto.setTime(DateUtils.convert(new Date()));
                            break;
                        default:
                            break;
                    }
                }
                priOnline2.setSettleMsg(JSON.toJSONString(list2));
                // 修改规划单状态
                priOnline2.setSettle(3);  // 审批通过
                priOnline2.setUpdateTime(new Date());
                if (!priOnline2Service.updateById(priOnline2)) {
                    throw new CoolException("确认失败,请联系管理员");
                }
                break;
            default:
                return R.error();
        }
        return R.ok("审批成功");
    }
}
src/main/java/com/zy/crm/manager/controller/PriOnlineController.java
@@ -72,12 +72,15 @@
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        Long deptId = getDeptId();
        boolean signUserId = false;
        boolean signDeptId = false;
        boolean signHostId = false;
        for (Map.Entry<String, Object> entry : map.entrySet()){
            if (entry.getKey().equals("dept_id")){
                signDeptId = true;
                if (String.valueOf(entry.getValue()).equals("19")){
                    signHostId = true;
                }
            }
        }
        for (Map.Entry<String, Object> entry : map.entrySet()){
@@ -100,6 +103,9 @@
        if (!signUserId && !signDeptId){
            wrapper.eq("user_id", getUserId());
        }
        if (signHostId){
            wrapper.or().eq("host_id",1);
        }
    }
    @RequestMapping(value = "/priOnline/add/auth")
src/main/java/com/zy/crm/manager/controller/PriQuoteBudgetController.java
@@ -1,5 +1,6 @@
package com.zy.crm.manager.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
@@ -11,15 +12,13 @@
import com.core.common.DateUtils;
import com.core.common.R;
import com.core.domain.KeyValueVo;
import com.core.exception.CoolException;
import com.zy.crm.common.model.SettleDto;
import com.zy.crm.common.web.BaseController;
import com.zy.crm.manager.entity.Item;
import com.zy.crm.manager.entity.Plan;
import com.zy.crm.manager.entity.PriQuoteBudget;
import com.zy.crm.manager.entity.PriSales;
import com.zy.crm.manager.service.ItemService;
import com.zy.crm.manager.service.PlanService;
import com.zy.crm.manager.service.PriQuoteBudgetService;
import com.zy.crm.manager.service.PriSalesService;
import com.zy.crm.manager.entity.*;
import com.zy.crm.manager.service.*;
import com.zy.crm.system.entity.User;
import com.zy.crm.system.service.UserService;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
@@ -44,10 +43,21 @@
    @Autowired
    private PriSalesService priSalesService;
    @Autowired
    private PriQuoteService priQuoteService;
    @Autowired
    private UserService userService;
    @RequestMapping(value = "/priQuoteBudget/{id}/auth")
    @ManagerAuth
    public R get(@PathVariable("id") String id) {
        return R.ok(priQuoteBudgetService.selectById(String.valueOf(id)));
        PriQuoteBudget priQuoteBudget = priQuoteBudgetService.selectById(String.valueOf(id));
        assert priQuoteBudget != null;
        JSONObject resultObj = JSON.parseObject(JSON.toJSONString(priQuoteBudget));
        // 步骤条相关
        resultObj.put("step", priQuoteBudget.getSettle() == 4 ? 0 : priQuoteBudget.getSettle() + 1);
        return R.ok().add(resultObj);
    }
    @RequestMapping(value = "/priQuoteBudget/list/auth")
@@ -59,7 +69,7 @@
                  @RequestParam(required = false)String condition,
                  @RequestParam Map<String, Object> param){
        EntityWrapper<PriQuoteBudget> wrapper = new EntityWrapper<>();
        wrapper.setSqlSelect("id,title,create_time as createTime,filepath,item_id as itemId,order_num as orderNum,template_name as templateName,user_id as userId,update_user_id as updateUserId,update_time as updateTime,in_order_num as inOrderNum,member_id as memberId");
        wrapper.setSqlSelect("id,title,create_time as createTime,settle,filepath,item_id as itemId,order_num as orderNum,template_name as templateName,user_id as userId,update_user_id as updateUserId,update_time as updateTime,in_order_num as inOrderNum,member_id as memberId");
        wrapper.in("member_id", getUserRoleBelongsToUserId());
        excludeTrash(param);
        convert(param, wrapper);
@@ -71,9 +81,13 @@
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        boolean signUserId = false;
        boolean signDeptId = false;
        boolean signHostId = false;
        for (Map.Entry<String, Object> entry : map.entrySet()){
            if (entry.getKey().equals("dept_id")){
                signDeptId = true;
                if (String.valueOf(entry.getValue()).equals("19")){
                    signHostId = true;
                }
            }
        }
        for (Map.Entry<String, Object> entry : map.entrySet()){
@@ -96,6 +110,9 @@
        if (!signUserId && !signDeptId){
            wrapper.eq("user_id", getUserId());
        }
        if (signHostId){
            wrapper.or().eq("host_id",1);
        }
    }
    @RequestMapping(value = "/priQuoteBudget/add/auth")
@@ -108,6 +125,7 @@
        priQuoteBudget.setTitle(map.get("title").toString());
        priQuoteBudget.setTemplateName(priSales.getTemplateName());
        priQuoteBudget.setSheetData(map.get("sheetData").toString());
        priQuoteBudget.setPriSalesId(Long.parseLong(map.get("priSalesId").toString()));
        priQuoteBudget.setItemId(priSales.getItemId());
        //保存产品费用明细订单号
        priQuoteBudget.setOrderNum(priSales.getInOrderNum());
@@ -125,6 +143,16 @@
        //业务员
        Plan plan = planService.selectById(priQuoteBudget.getItemId());
        priQuoteBudget.setMemberId(plan.getUserId());
        priQuoteBudget.setSettle(0);
        User manager = userService.getDeptManager(getHostId(), getUser().getDeptId());        // 获取部门领导
        List<String> initNames = new ArrayList<>();
        initNames.add("创建报价预算单模板");
        initNames.add("提交报价预算单");
        initNames.add("部门经理审核");
        initNames.add("业务员确认");
        priQuoteBudget.setSettleMsg(JSON.toJSONString(SettleDto.initSalesPricing(manager,getUser(),initNames,3)));
        //设置项目流程
        plan.setStep(4);
@@ -199,6 +227,12 @@
        if (Cools.isEmpty(ids)){
            return R.error();
        }
        for (Long id : ids){
            int  priQuote= priQuoteService.selectCount(new EntityWrapper<PriQuote>().eq("ori_quote_budget_id", id));
            if (priQuote!=0){
                return R.error("存在关联的报价单,禁止删除!!!");
            }
        }
        priQuoteBudgetService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
@@ -225,7 +259,7 @@
        for (PriQuoteBudget priQuoteBudget : page.getRecords()){
            Map<String, Object> map = new HashMap<>();
            map.put("id", priQuoteBudget.getId());
            map.put("value", priQuoteBudget.getInOrderNum() + "/" + priQuoteBudget.getPlanId$() + "/" + priQuoteBudget.getMemberId$());
            map.put("value", priQuoteBudget.getInOrderNum() + "/" + priQuoteBudget.getPlanId$() + "/" + priQuoteBudget.getMemberId$() + "/" + priQuoteBudget.getTemplateName());
            result.add(map);
        }
        return R.ok(result);
@@ -398,4 +432,120 @@
        }
    }
    @PostMapping(value = "/priQuoteBudget/approval/auth")
    @ManagerAuth
    public R approvalBusinessTrip(@RequestParam Long priQuoteBudgetId,
                                  @RequestParam(required = false) Long plannerId){
        PriQuoteBudget priQuoteBudget = priQuoteBudgetService.selectById(priQuoteBudgetId);
        assert priQuoteBudget != null;
        Date now = new Date();
        switch (priQuoteBudget.getSettle()) {
            case 0:
                User user2 = userService.selectById(priQuoteBudget.getUserId());
                User manager1 = userService.getDeptManager(getHostId(), user2.getDeptId());
                if (Cools.isEmpty(getUser())) {
                    return R.error("抱歉,您没有提交的权限");
                }
                if (!getUserId().equals(getUser().getId())) {
                    return R.error("抱歉,您没有提交的权限");
                }
                // 修改 settle 步骤数据
                List<SettleDto> list1 = JSON.parseArray(priQuoteBudget.getSettleMsg(), SettleDto.class);
                for (SettleDto dto : list1) {
                    switch (dto.getStep()) {
                        case 0:
                            dto.setCurr(Boolean.FALSE);
                            break;
                        case 1:
                            dto.setCurr(Boolean.TRUE);
                            dto.setMsg(getUser().getNickname() + "提交完成");
                            dto.setTime(DateUtils.convert(now));
                            break;
                        default:
                            break;
                    }
                }
                priQuoteBudget.setSettleMsg(JSON.toJSONString(list1));
                // 修改规划单状态
                priQuoteBudget.setSettle(1);
                priQuoteBudget.setUpdateUserId(getUserId());
                priQuoteBudget.setUpdateTime(now);
                priQuoteBudget.setMemberId(manager1.getId());
                if (!priQuoteBudgetService.updateById(priQuoteBudget)) {
                    throw new CoolException("提交失败,请联系管理员");
                }
                break;
            case 1:
                // 本部门经理审核
                User user = userService.selectById(priQuoteBudget.getUserId());
                User manager = userService.getDeptManager(getHostId(), user.getDeptId());
                if (manager.getId().equals(getUserId())) {
                    // 修改 settle 步骤数据
                    List<SettleDto> list = JSON.parseArray(priQuoteBudget.getSettleMsg(), SettleDto.class);
                    for (SettleDto dto : list) {
                        switch (dto.getStep()) {
                            case 1:
                                dto.setCurr(Boolean.FALSE);
                                break;
                            case 2:
                                dto.setCurr(Boolean.TRUE);
                                dto.setMsg("部门经理" + manager.getNickname() + "审批通过");
                                dto.setTime(DateUtils.convert(now));
                                break;
                            default:
                                break;
                        }
                    }
                    priQuoteBudget.setSettleMsg(JSON.toJSONString(list));
                    // 修改规划单状态
                    priQuoteBudget.setSettle(2);  // 申请通过
                    priQuoteBudget.setUpdateTime(now);
                    if (!priQuoteBudgetService.updateById(priQuoteBudget)) {
                        throw new CoolException("审核失败,请联系管理员");
                    }
                } else {
                    return R.error("抱歉,您没有审核的权限!!!");
                }
                break;
            case 2:
                // 业务员
                User salesman0 = userService.selectById(priQuoteBudget.getUserId());
                if (!getUserId().equals(salesman0.getId())) {
                    return R.error("抱歉,您无需确认!!!");
                }
                // 修改 settle 步骤数据
                List<SettleDto> list2 = JSON.parseArray(priQuoteBudget.getSettleMsg(), SettleDto.class);
                for (SettleDto dto : list2) {
                    switch (dto.getStep()) {
                        case 2:
                            dto.setCurr(Boolean.TRUE);
                            break;
                        case 3:
                            dto.setCurr(Boolean.TRUE);
                            dto.setMsg("业务员" + salesman0.getNickname() + "以确认");
                            dto.setTime(DateUtils.convert(new Date()));
                            break;
                        default:
                            break;
                    }
                }
                priQuoteBudget.setSettleMsg(JSON.toJSONString(list2));
                // 修改规划单状态
                priQuoteBudget.setSettle(3);  // 审批通过
                priQuoteBudget.setUpdateTime(new Date());
                if (!priQuoteBudgetService.updateById(priQuoteBudget)) {
                    throw new CoolException("确认失败,请联系管理员");
                }
                break;
            default:
                return R.error();
        }
        return R.ok("审批成功");
    }
}
src/main/java/com/zy/crm/manager/controller/PriQuoteController.java
@@ -129,6 +129,7 @@
        priQuote.setTitle(map.get("title").toString());
        priQuote.setTemplateName(priQuoteBudget.getTemplateName());
        priQuote.setSheetData(map.get("sheetData").toString());
        priQuote.setOriQuoteBudgetId(Long.parseLong(map.get("priQuoteBudgetId").toString()));
        priQuote.setItemId(priQuoteBudget.getItemId());
        priQuote.setOrderNum(priQuoteBudget.getInOrderNum());
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
src/main/java/com/zy/crm/manager/controller/PriSalesController.java
@@ -1,5 +1,6 @@
package com.zy.crm.manager.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
@@ -11,15 +12,13 @@
import com.core.common.Cools;
import com.core.common.R;
import com.core.domain.KeyValueVo;
import com.core.exception.CoolException;
import com.zy.crm.common.model.SettleDto;
import com.zy.crm.common.web.BaseController;
import com.zy.crm.manager.entity.Item;
import com.zy.crm.manager.entity.Plan;
import com.zy.crm.manager.entity.PriOnline;
import com.zy.crm.manager.entity.PriSales;
import com.zy.crm.manager.service.ItemService;
import com.zy.crm.manager.service.PlanService;
import com.zy.crm.manager.service.PriOnlineService;
import com.zy.crm.manager.service.PriSalesService;
import com.zy.crm.manager.entity.*;
import com.zy.crm.manager.service.*;
import com.zy.crm.system.entity.User;
import com.zy.crm.system.service.UserService;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
@@ -39,15 +38,26 @@
    private PriSalesService priSalesService;
    @Autowired
    private PriOnlineService priOnlineService;
    private PriOnline2Service priOnline2Service;
    @Autowired
    private PlanService planService;
    @Autowired
    private PriQuoteBudgetService priQuoteBudgetService;
    @Autowired
    private UserService userService;
    @RequestMapping(value = "/priSales/{id}/auth")
    @ManagerAuth
    public R get(@PathVariable("id") String id) {
        return R.ok(priSalesService.selectById(String.valueOf(id)));
        PriSales priSales = priSalesService.selectById(String.valueOf(id));
        assert priSales != null;
        JSONObject resultObj = JSON.parseObject(JSON.toJSONString(priSales));
        // 步骤条相关
        resultObj.put("step", priSales.getSettle() == 4 ? 0 : priSales.getSettle() + 1);
        return R.ok().add(resultObj);
    }
    @RequestMapping(value = "/priSales/list/auth")
@@ -59,7 +69,7 @@
                  @RequestParam(required = false)String condition,
                  @RequestParam Map<String, Object> param){
        EntityWrapper<PriSales> wrapper = new EntityWrapper<>();
        wrapper.setSqlSelect("id,title,create_time as createTime,filepath,item_id as itemId,order_num as orderNum,template_name as templateName,user_id as userId,update_user_id as updateUserId,update_time as updateTime,in_order_num as inOrderNum,member_id as memberId");
        wrapper.setSqlSelect("id,title,create_time as createTime,settle,filepath,item_id as itemId,order_num as orderNum,template_name as templateName,user_id as userId,update_user_id as updateUserId,update_time as updateTime,in_order_num as inOrderNum,member_id as memberId");
        wrapper.in("member_id", getUserRoleBelongsToUserId("allopen"));
        excludeTrash(param);
        convert(param, wrapper);
@@ -71,9 +81,13 @@
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        boolean signUserId = false;
        boolean signDeptId = false;
        boolean signHostId = false;
        for (Map.Entry<String, Object> entry : map.entrySet()){
            if (entry.getKey().equals("dept_id")){
                signDeptId = true;
                if (String.valueOf(entry.getValue()).equals("19")){
                    signHostId = true;
                }
            }
        }
        for (Map.Entry<String, Object> entry : map.entrySet()){
@@ -96,20 +110,24 @@
        if (!signUserId && !signDeptId){
            wrapper.eq("user_id", getUserId());
        }
        if (signHostId){
            wrapper.or().eq("host_id",1);
        }
    }
    @RequestMapping(value = "/priSales/add/auth")
    @ManagerAuth(memo = "添加产品费用明细")
    public R add(@RequestBody Map<String,Object> map) {
        PriOnline priOnline = priOnlineService.selectById(Long.parseLong(map.get("priOnlineId").toString()));
        PriOnline2 priOnline2 = priOnline2Service.selectById(Long.parseLong(map.get("priOnlineId").toString()));
        PriSales priSales = new PriSales();
        priSales.setCreateTime(new Date());
        priSales.setTitle(map.get("title").toString());
        priSales.setTemplateName(priOnline.getTemplateName());
        priSales.setTemplateName(priOnline2.getTemplateName());
        priSales.setSheetData(map.get("sheetData").toString());
        priSales.setItemId(priOnline.getItemId());
        priSales.setOrderNum(priOnline.getOrderNum());
        priSales.setPriOnline2Id(Long.parseLong(map.get("priOnlineId").toString()));
        priSales.setItemId(priOnline2.getItemId());
        priSales.setOrderNum(priOnline2.getOrderNum());
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
        priSales.setInOrderNum(format.format(new Date()));
@@ -124,6 +142,16 @@
        //业务员
        Plan plan = planService.selectById(priSales.getItemId());
        priSales.setMemberId(plan.getUserId());
        priSales.setSettle(0);
        User manager = userService.getDeptManager(getHostId(), getUser().getDeptId());        // 获取部门领导
        List<String> initNames = new ArrayList<>();
        initNames.add("创建产品费用明细模板");
        initNames.add("提交产品费用明细");
        initNames.add("部门经理审核");
        initNames.add("业务员确认");
        priSales.setSettleMsg(JSON.toJSONString(SettleDto.initSalesPricing(manager,getUser(),initNames,3)));
        //设置项目流程
        plan.setStep(3);
@@ -198,6 +226,12 @@
        if (Cools.isEmpty(ids)){
            return R.error();
        }
        for (Long id : ids){
            int  priQuoteBudget= priQuoteBudgetService.selectCount(new EntityWrapper<PriQuoteBudget>().eq("pri_sales_id", id));
            if (priQuoteBudget!=0){
                return R.error("存在关联的报价预算单,禁止删除!!!");
            }
        }
        priSalesService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
@@ -224,7 +258,7 @@
        for (PriSales priSales : page.getRecords()){
            Map<String, Object> map = new HashMap<>();
            map.put("id", priSales.getId());
            map.put("value", priSales.getInOrderNum() + "/" + priSales.getPlanId$() + "/" + priSales.getMemberId$());
            map.put("value", priSales.getInOrderNum() + "/" + priSales.getPlanId$() + "/" + priSales.getMemberId$()+"/" + priSales.getTemplateName());
            result.add(map);
        }
        return R.ok(result);
@@ -411,4 +445,121 @@
        }
    }
    @PostMapping(value = "/priSales/approval/auth")
    @ManagerAuth
    public R approvalBusinessTrip(@RequestParam Long priSalesId,
                                  @RequestParam(required = false) Long plannerId){
        PriSales priSales = priSalesService.selectById(priSalesId);
        assert priSales != null;
        Date now = new Date();
        switch (priSales.getSettle()) {
            case 0:
                User user2 = userService.selectById(priSales.getUserId());
                User manager1 = userService.getDeptManager(getHostId(), user2.getDeptId());
                if (Cools.isEmpty(getUser())) {
                    return R.error("抱歉,您没有提交的权限");
                }
                if (!getUserId().equals(getUser().getId())) {
                    return R.error("抱歉,您没有提交的权限");
                }
                // 修改 settle 步骤数据
                List<SettleDto> list1 = JSON.parseArray(priSales.getSettleMsg(), SettleDto.class);
                for (SettleDto dto : list1) {
                    switch (dto.getStep()) {
                        case 0:
                            dto.setCurr(Boolean.FALSE);
                            break;
                        case 1:
                            dto.setCurr(Boolean.TRUE);
                            dto.setMsg(getUser().getNickname() + "提交完成");
                            dto.setTime(DateUtils.convert(now));
                            break;
                        default:
                            break;
                    }
                }
                priSales.setSettleMsg(JSON.toJSONString(list1));
                // 修改规划单状态
                priSales.setSettle(1);
                priSales.setUpdateUserId(getUserId());
                priSales.setUpdateTime(now);
                priSales.setMemberId(manager1.getId());
                if (!priSalesService.updateById(priSales)) {
                    throw new CoolException("提交失败,请联系管理员");
                }
                break;
            case 1:
                // 本部门经理审核
                User user = userService.selectById(priSales.getUserId());
                User manager = userService.getDeptManager(getHostId(), user.getDeptId());
                if (manager.getId().equals(getUserId())) {
                    // 修改 settle 步骤数据
                    List<SettleDto> list = JSON.parseArray(priSales.getSettleMsg(), SettleDto.class);
                    for (SettleDto dto : list) {
                        switch (dto.getStep()) {
                            case 1:
                                dto.setCurr(Boolean.FALSE);
                                break;
                            case 2:
                                dto.setCurr(Boolean.TRUE);
                                dto.setMsg("部门经理" + manager.getNickname() + "审批通过");
                                dto.setTime(DateUtils.convert(now));
                                break;
                            default:
                                break;
                        }
                    }
                    priSales.setSettleMsg(JSON.toJSONString(list));
                    // 修改规划单状态
                    priSales.setSettle(2);  // 申请通过
                    priSales.setUpdateTime(now);
                    if (!priSalesService.updateById(priSales)) {
                        throw new CoolException("审核失败,请联系管理员");
                    }
                } else {
                    return R.error("抱歉,您没有审核的权限!!!");
                }
                break;
            case 2:
                // 业务员
                User salesman0 = userService.selectById(priSales.getUserId());
                if (!getUserId().equals(salesman0.getId())) {
                    return R.error("抱歉,您无需确认!!!");
                }
                // 修改 settle 步骤数据
                List<SettleDto> list2 = JSON.parseArray(priSales.getSettleMsg(), SettleDto.class);
                for (SettleDto dto : list2) {
                    switch (dto.getStep()) {
                        case 2:
                            dto.setCurr(Boolean.TRUE);
                            break;
                        case 3:
                            dto.setCurr(Boolean.TRUE);
                            dto.setMsg("业务员" + salesman0.getNickname() + "以确认");
                            dto.setTime(DateUtils.convert(new Date()));
                            break;
                        default:
                            break;
                    }
                }
                priSales.setSettleMsg(JSON.toJSONString(list2));
                // 修改规划单状态
                priSales.setSettle(3);  // 审批通过
                priSales.setUpdateTime(new Date());
                if (!priSalesService.updateById(priSales)) {
                    throw new CoolException("确认失败,请联系管理员");
                }
                break;
            default:
                return R.error();
        }
        return R.ok("审批成功");
    }
}
src/main/java/com/zy/crm/manager/controller/ReimburseOnlineController.java
@@ -534,7 +534,7 @@
                reimburseOnline.setMemberId(manager1.getId());
                if (!reimburseOnlineService.updateById(reimburseOnline)) {
                    throw new CoolException("审核失败,请联系管理员");
                    throw new CoolException("提交失败,请联系管理员");
                }
                break;
            case 1:
src/main/java/com/zy/crm/manager/entity/Contract.java
@@ -185,9 +185,29 @@
    @TableField("dept_id")
    private Long deptId;
    /**
     * hostId
     */
    @ApiModelProperty(value= "hostId")
    @TableField("host_id")
    private Long hostId;
    /**
     * 进度
     */
    @ApiModelProperty(value= "进度")
    private Integer settle;
    /**
     * 流程进度
     */
    @ApiModelProperty(value= "流程进度")
    @TableField("settle_msg")
    private String settleMsg;
    public Contract() {}
    public Contract(Long id, String customer, String address, String company, String companyAddress, String taxNum, String bank, String bankNum, Date createTime, Date updateTime, Long userId, Long updateBy, String filepath, String city, String shippingAddress, String shippingName, String shippingPhone, Double price, String email, String name, Integer status, String memo, String boss, String serial, Long deptId) {
    public Contract(Long id, String customer, String address, String company, String companyAddress, String taxNum, String bank, String bankNum, Date createTime, Date updateTime, Long userId, Long updateBy, String filepath, String city, String shippingAddress, String shippingName, String shippingPhone, Double price, String email, String name, Integer status, String memo, String boss, String serial, Long deptId, Long hostId,Integer settle,String settleMsg) {
        this.id = id;
        this.customer = customer;
        this.address = address;
@@ -213,6 +233,9 @@
        this.boss = boss;
        this.serial = serial;
        this.deptId = deptId;
        this.hostId = hostId;
        this.settle = settle;
        this.settleMsg = settleMsg;
    }
    //    Contract contract = new Contract(
@@ -237,6 +260,24 @@
//            null    // 电子邮箱
//    );
    public String getSettle$(){
        if (null == this.settle){ return null; }
        switch (this.settle){
            case 0:
                return "等待提交";
            case 1:
                return "等待组长审批";
            case 2:
                return "等待总裁办审批";
            case 3:
                return "等待确认";
            case 4:
                return "审批通过";
            default:
                return String.valueOf(this.settle);
        }
    }
    public String getCreateTime$(){
        if (Cools.isEmpty(this.createTime)){
            return "";
src/main/java/com/zy/crm/manager/entity/PriOnline2.java
@@ -6,6 +6,7 @@
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.PlanService;
import com.zy.crm.system.entity.User;
import com.zy.crm.system.service.UserService;
@@ -99,13 +100,37 @@
    @TableField("check_data_file")
    private String checkDataFile;
    /**
     * hostId
     */
    @ApiModelProperty(value= "hostId")
    @TableField("host_id")
    private Long hostId;
    /**
     * 进度
     */
    @ApiModelProperty(value= "进度")
    private Integer settle;
    /**
     * 流程进度
     */
    @ApiModelProperty(value= "流程进度")
    @TableField("settle_msg")
    private String settleMsg;
    @ApiModelProperty(value= "")
    private String form;
    public PriOnline2() {}
    public PriOnline2(String title, String sheetData, Date createTime, String filepath) {
    public PriOnline2(String title, String sheetData, Date createTime, String filepath,Integer settle) {
        this.title = title;
        this.sheetData = sheetData;
        this.createTime = createTime;
        this.filepath = filepath;
        this.settle = settle;
    }
//    PriOnline priOnline = new PriOnline(
@@ -113,6 +138,22 @@
//            null,    // excel表数据
//            null    // 创建时间
//    );
    public String getSettle$(){
        if (null == this.settle){ return null; }
        switch (this.settle){
            case 0:
                return "等待提交";
            case 1:
                return "等待审批";
            case 2:
                return "等待确认";
            case 3:
                return "审批通过";
            default:
                return String.valueOf(this.settle);
        }
    }
    public String getCreateTime$(){
        if (Cools.isEmpty(this.createTime)){
@@ -137,6 +178,15 @@
//        return null;
//    }
    public Long getCstmrId$(){
        CstmrService cstmrService = SpringUtils.getBean(CstmrService.class);
        Cstmr cstmr = cstmrService.selectByName(1L, this.templateName);
        if (!Cools.isEmpty(cstmr)){
            return cstmr.getId();
        }
        return 0L;
    }
    public String getPlanId$() {
        PlanService planService = SpringUtils.getBean(PlanService.class);
        Plan plan = planService.selectById(this.itemId);
src/main/java/com/zy/crm/manager/entity/PriQuote.java
@@ -6,6 +6,7 @@
import java.util.Date;
import com.core.common.SpringUtils;
import com.zy.crm.manager.service.CstmrService;
import com.zy.crm.manager.service.ItemService;
import com.zy.crm.manager.service.PlanService;
import com.zy.crm.system.entity.User;
@@ -119,6 +120,10 @@
    @TableField("template")
    private String template;
    @ApiModelProperty(value= "上级id")
    @TableField("ori_quote_budget_id")
    private Long oriQuoteBudgetId;
    public PriQuote() {}
    public PriQuote(String title,String sheetData,Date createTime,String filepath,Integer settle) {
@@ -129,6 +134,15 @@
        this.settle = settle;
    }
    public Long getCstmrId$(){
        CstmrService cstmrService = SpringUtils.getBean(CstmrService.class);
        Cstmr cstmr = cstmrService.selectByName(1L, this.templateName);
        if (!Cools.isEmpty(cstmr)){
            return cstmr.getId();
        }
        return 0L;
    }
    public String getSettle$(){
        if (null == this.settle){ return null; }
        switch (this.settle){
src/main/java/com/zy/crm/manager/entity/PriQuoteBudget.java
@@ -6,6 +6,7 @@
import java.util.Date;
import com.core.common.SpringUtils;
import com.zy.crm.manager.service.CstmrService;
import com.zy.crm.manager.service.ItemService;
import com.zy.crm.manager.service.PlanService;
import com.zy.crm.system.entity.User;
@@ -86,9 +87,33 @@
    @TableField("member_id")
    private Long memberId;
    @ApiModelProperty(value= "上级id")
    @TableField("pri_sales_id")
    private Long priSalesId;
    @ApiModelProperty(value= "创建部门")
    @TableField("dept_id")
    private Long deptId;
    /**
     * hostId
     */
    @ApiModelProperty(value= "hostId")
    @TableField("host_id")
    private Long hostId;
    /**
     * 进度
     */
    @ApiModelProperty(value= "进度")
    private Integer settle;
    /**
     * 流程进度
     */
    @ApiModelProperty(value= "流程进度")
    @TableField("settle_msg")
    private String settleMsg;
    public PriQuoteBudget() {}
@@ -99,6 +124,31 @@
        this.filepath = filepath;
    }
    public String getSettle$(){
        if (null == this.settle){ return null; }
        switch (this.settle){
            case 0:
                return "等待提交";
            case 1:
                return "等待审批";
            case 2:
                return "等待确认";
            case 3:
                return "审批通过";
            default:
                return String.valueOf(this.settle);
        }
    }
    public Long getCstmrId$(){
        CstmrService cstmrService = SpringUtils.getBean(CstmrService.class);
        Cstmr cstmr = cstmrService.selectByName(1L, this.templateName);
        if (!Cools.isEmpty(cstmr)){
            return cstmr.getId();
        }
        return 0L;
    }
    public String getCreateTime$(){
        if (Cools.isEmpty(this.createTime)){
            return "";
src/main/java/com/zy/crm/manager/entity/PriSales.java
@@ -6,9 +6,7 @@
import java.util.Date;
import com.core.common.SpringUtils;
import com.zy.crm.manager.service.ItemService;
import com.zy.crm.manager.service.OrderService;
import com.zy.crm.manager.service.PlanService;
import com.zy.crm.manager.service.*;
import com.zy.crm.system.entity.User;
import com.zy.crm.system.service.UserService;
import org.springframework.format.annotation.DateTimeFormat;
@@ -87,9 +85,33 @@
    @TableField("in_order_num")
    private String inOrderNum;
    @ApiModelProperty(value= "上级id")
    @TableField("pri_online2_id")
    private Long priOnline2Id;
    @ApiModelProperty(value= "业务员")
    @TableField("member_id")
    private Long memberId;
    /**
     * hostId
     */
    @ApiModelProperty(value= "hostId")
    @TableField("host_id")
    private Long hostId;
    /**
     * 进度
     */
    @ApiModelProperty(value= "进度")
    private Integer settle;
    /**
     * 流程进度
     */
    @ApiModelProperty(value= "流程进度")
    @TableField("settle_msg")
    private String settleMsg;
    public PriSales() {}
@@ -98,6 +120,31 @@
        this.sheetData = sheetData;
        this.createTime = createTime;
        this.filepath = filepath;
    }
    public String getSettle$(){
        if (null == this.settle){ return null; }
        switch (this.settle){
            case 0:
                return "等待提交";
            case 1:
                return "等待审批";
            case 2:
                return "等待确认";
            case 3:
                return "审批通过";
            default:
                return String.valueOf(this.settle);
        }
    }
    public Long getCstmrId$(){
        CstmrService cstmrService = SpringUtils.getBean(CstmrService.class);
        Cstmr cstmr = cstmrService.selectByName(1L, this.templateName);
        if (!Cools.isEmpty(cstmr)){
            return cstmr.getId();
        }
        return 0L;
    }
    public String getCreateTime$(){
@@ -115,6 +162,14 @@
        }
        return null;
    }
    public String getPriOnline2Id$() {
        PriSalesService priSalesService = SpringUtils.getBean(PriSalesService.class);
        PriSales priSales = priSalesService.selectById(this.priOnline2Id);
        if (!Cools.isEmpty(priSales)){
            return String.valueOf(priSales.getId());
        }
        return null;
    }
    public String getUpdateTime$(){
        if (Cools.isEmpty(this.updateTime)){
src/main/java/com/zy/crm/manager/entity/ProcessPermissions.java
@@ -133,6 +133,8 @@
                return "报销流程";
            case 4:
                return "出差流程";
            case 7:
                return "合同管理";
            default:
                return String.valueOf(this.processMemo);
        }
src/main/java/com/zy/crm/manager/entity/ReimburseOnline.java
@@ -167,6 +167,30 @@
//            null    // 创建时间
//    );
    public String getSettle$(){
        if (null == this.settle){ return null; }
        switch (this.settle){
            case 0:
                return "待提交";
            case 1:
                return "等待部门经理审核";
            case 2:
                return "等待结点3审核";
            case 3:
                return "等待结点4审核";
            case 4:
                return "等待结点5审核";
            case 5:
                return "等待结点6审核";
            case 6:
                return "申请通过";
            case 7:
                return "申请通过";
            default:
                return String.valueOf(this.settle);
        }
    }
    public String getCreateTime$(){
        if (Cools.isEmpty(this.createTime)){
            return "";
src/main/java/com/zy/crm/manager/service/impl/OrderServiceImpl.java
@@ -43,9 +43,9 @@
    private String getNextUuid(Long hostId) {
        Order order = this.baseMapper.selectOrderByNewestUuid(hostId);
        if (order == null) {
            return "0001";
            return "00001";
        }
        return zerofill(String.valueOf(Integer.parseInt(order.getUuid()) + 1), 4);
        return zerofill(String.valueOf(Integer.parseInt(order.getUuid()) + 1), 5);
    }
    public static String zerofill(String msg, Integer count){
src/main/java/com/zy/crm/manager/service/impl/PlanServiceImpl.java
@@ -68,9 +68,9 @@
    private String getNextUuid(Long hostId) {
        Plan plan = this.baseMapper.selectPlanByNewestUuid(hostId);
        if (plan == null) {
            return "0001";
            return "00001";
        }
        return zerofill(String.valueOf(Integer.parseInt(plan.getUuid()) + 1), 4);
        return zerofill(String.valueOf(Integer.parseInt(plan.getUuid()) + 1), 5);
    }
    public static String zerofill(String msg, Integer count){
src/main/resources/mapper/ContractMapper.xml
@@ -29,6 +29,9 @@
        <result column="boss" property="boss" />
        <result column="serial" property="serial" />
        <result column="dept_id" property="deptId" />
        <result column="settle" property="settle" />
        <result column="settle_msg" property="settleMsg" />
        <result column="host_id" property="hostId" />
    </resultMap>
src/main/resources/mapper/PriOnline2Mapper.xml
@@ -17,6 +17,7 @@
        <result column="status" property="status" />
        <result column="update_time" property="updateTime" />
        <result column="check_data" property="checkData" />
        <result column="settle" property="settle" />
    </resultMap>
    <!-- 查询结果不包含excel数据data,以免结果集过大 -->
@@ -32,6 +33,7 @@
        <result column="dept_id" property="deptId" />
        <result column="status" property="status" />
        <result column="update_time" property="updateTime" />
        <result column="settle" property="settle" />
    </resultMap>
    <select id="listByPage" resultMap="NoDataResultMap">
src/main/resources/mapper/PriSalesMapper.xml
@@ -9,6 +9,7 @@
        <result column="sheet_data" property="sheetData" />
        <result column="create_time" property="createTime" />
        <result column="dept_id" property="deptId" />
        <result column="pri_online2_id" property="priOnline2Id" />
    </resultMap>
src/main/webapp/static/js/common.js
@@ -236,3 +236,7 @@
    return(false);
}
var businessTripByMore;
var priOnlineByMore;
var priSalesByMore;
var priQuoteBudgetByMore;
var contractByMore;
src/main/webapp/static/js/contract/contract.js
@@ -88,11 +88,12 @@
            , {field: 'status$', align: 'center', title: '状态'}
            , {field: 'userId$', align: 'center', title: '添加人员'}
            , {field: 'createTime$', align: 'center', title: '添加时间'}
            , {field: 'settle$', align: 'center',title: '进度', style: 'color: #1890ff;cursor:pointer', event: 'more',hide: false}
            , {field: 'updateBy$', align: 'center', title: '修改人员'}
            , {field: 'updateTime$', align: 'center', title: '修改时间'}
            , {field: 'memo', align: 'center', title: '备注'}
            , {fixed: 'right', title: '操作', align: 'center', toolbar: '#operate', width: 400}
            , {fixed: 'right', title: '操作', align: 'center', toolbar: '#operate', width: 500}
        ]],
        request: {
            pageName: 'curr',
@@ -193,6 +194,29 @@
    table.on('tool(contract)', function (obj) {
        var data = obj.data;
        switch (obj.event) {
            case 'approval':
                layer.confirm('审批通过?', {
                    skin: 'layui-layer-admin',
                    shade: .1,
                    offset: '200px',
                    title: data.name
                }, function (i) {
                    layer.close(i);
                    approval(data.id);
                });
                break;
            case 'more':
                top.contractByMore = data.id;
                admin.popupRight({
                    type: 1,
                    window: "top",
                    area: "1250px",
                    url: "contract_more.html",
                    end: function () {
                        // $(".layui-laypage-btn")[0].click();
                    }
                })
                break;
            case 'edit':
                showEditModel(data);
                break;
@@ -472,6 +496,33 @@
    layDateRender();
    function approval(contractId, plannerId, dIdx) {
        let loadIndex = layer.load(2);
        $.ajax({
            url: baseUrl+"/contract/approval/auth",
            headers: {'token': localStorage.getItem('token')},
            data: {
                contractId: contractId,
                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});
                }
            }
        })
    }
});
// 关闭动作
src/main/webapp/static/js/order/order.js
@@ -2,6 +2,8 @@
var pageCount = 0;
var treeCond;
var admin;
var userId ;
var userName ;
layui.config({
    base: baseUrl + "/static/layui/lay/modules/"
}).extend({
@@ -268,6 +270,7 @@
            success: function (layero, dIndex) {
                let cstmrSel = loadCstmrSel();
                let companySel = loadCompanySel();
                let method = mData?'update':'add';
                if (!mData){
                    companySel.setValue([{name: "浙江中扬立库技术有限公司", value: 4}]);
                }
@@ -277,8 +280,8 @@
                    if (mData.company) { companySel.setValue([{name: mData.company$, value: mData.company}]); }
                }else {
                    mData = {
                        director: 25,
                        director$: "陆晓涛"
                        director: Number(userId),
                        director$: userName
                    }
                }
                layDateRender(mData);
@@ -313,11 +316,13 @@
                    }
                    var loadIndex = layer.load(2);
                    $.ajax({
                        url: baseUrl+"/order/"+(mData?'update':'add')+"/auth",
                        url: baseUrl+"/order/"+(method)+"/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: data.field,
                        method: 'POST',
                        success: function (res) {
                            console.log(data.field)
                            console.log(res)
                            layer.close(loadIndex);
                            if (res.code === 200){
                                layer.close(dIndex);
@@ -328,6 +333,12 @@
                            }else {
                                layer.msg(res.msg, {icon: 2});
                            }
                        }
                        ,error: function(xhr, status, error) {
                            // 处理错误
                            console.log(data.field)
                            console.log(res)
                            console.log(error)
                        }
                    })
                    return false;
@@ -410,6 +421,25 @@
        });
    }
    $(document).ready(function() {
        $.ajax({
            url: baseUrl + "/order/userName/userId/auth",
            headers: { 'token': localStorage.getItem('token') },
            method: 'POST',
            success: function(res) {
                if (res.code === 200) {
                    userId = res.data.value;
                    userName = res.data.name;
                }
            },
            error: function(xhr, status, error) {
                // 处理错误
                console.log(error);
            }
        });
    });
    window.loadCstmrSel = function () {
        return xmSelect.render({
            el: '#cstmrXmlSel',
src/main/webapp/static/js/priOnline2/priOnline.js
@@ -84,14 +84,17 @@
        cols: [[
            {type: 'checkbox', fixed: 'left'}
            ,{field: 'id', title: 'ID', sort: true,align: 'center', fixed: 'left', width: 80,hide: true}
            ,{field: 'templateName', align: 'center',title: '核价名',hide: false}
            ,{field: 'orderNum', align: 'center',title: '核价单号'}
            ,{field: 'planId$', align: 'center',title: '规划单号'}
            ,{field: 'templateName', align: 'center',title: '客户名称', style: 'color: #1890ff;cursor:pointer', event: 'moreCstmr', width: 350,hide: false}
            ,{field: 'cstmrId$', align: 'center',title: '客户id',hide: true}
            ,{field: 'orderNum', align: 'center',title: '核价单号',hide: false}
            ,{field: 'planId$', align: 'center',title: '规划单号', style: 'color: #1890ff;cursor:pointer', event: 'morePlan',hide: false}
            ,{field: 'itemId', align: 'center',title: '规划单号', hide: true}
            ,{field: 'createTime$', align: 'center',title: '创建时间'}
            ,{field: 'updateTime$', align: 'center',title: '更新时间'}
            ,{field: 'status$', align: 'center',title: '状态'}
            ,{field: 'memberId$', align: 'center',title: '业务员'}
            ,{field: 'user$', align: 'center',title: '创建人员'}
            ,{field: 'settle$', align: 'center',title: '进度', style: 'color: #1890ff;cursor:pointer', event: 'more',hide: false}
            // ,{field: 'user$', align: 'center',title: '创建人员'}
            ,{field: 'updateUserId$', align: 'center',title: '更新人员'}
            ,{field: 'checkDataStatus$', align: 'center',title: '报价数据'}
            ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width:350}
@@ -169,7 +172,7 @@
                } else {
                    layer.confirm('确定删除'+(ids.length===1?'此':ids.length)+'条数据吗', function(){
                        $.ajax({
                            url: baseUrl+"/priOnline/delete/auth",
                            url: baseUrl+"/priOnline2/delete/auth",
                            headers: {'token': localStorage.getItem('token')},
                            data: {ids: ids},
                            method: 'POST',
@@ -207,7 +210,7 @@
                        'fields': fields
                    };
                    $.ajax({
                        url: baseUrl+"/priOnline/export/auth",
                        url: baseUrl+"/priOnline2/export/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: JSON.stringify(param),
                        dataType:'json',
@@ -233,6 +236,53 @@
    table.on('tool(priOnline)', function(obj){
        var data = obj.data;
        switch (obj.event) {
            case 'approval':
                layer.confirm('审批通过?', {
                    skin: 'layui-layer-admin',
                    shade: .1,
                    offset: '200px',
                    title: data.name
                }, function (i) {
                    layer.close(i);
                    approval(data.id);
                });
                break;
            case 'moreCstmr':
                top.cstmrByMore = data.cstmrId$;
                admin.popupRight({
                    type: 1,
                    window: "top",
                    area: "1250px",
                    url: "../cstmr/cstmr_more.html",
                    end: function () {
                        // $(".layui-laypage-btn")[0].click();
                    }
                })
                break;
            case 'morePlan':
                top.planByMore = data.itemId;
                admin.popupRight({
                    type: 1,
                    window: "top",
                    area: "1250px",
                    url: "../plan/plan_more_other.html",
                    end: function () {
                        // $(".layui-laypage-btn")[0].click();
                    }
                })
                break;
            case 'more':
                top.priOnlineByMore = data.id;
                admin.popupRight({
                    type: 1,
                    window: "top",
                    area: "1250px",
                    url: "priOnline_more.html",
                    end: function () {
                        // $(".layui-laypage-btn")[0].click();
                    }
                })
                break;
            // 核价
            case 'check':
                layer.open({
@@ -447,6 +497,34 @@
        });
    }
    function approval(priOnlineId, plannerId, dIdx) {
        let loadIndex = layer.load(2);
        $.ajax({
            url: baseUrl+"/priOnline2/approval/auth",
            headers: {'token': localStorage.getItem('token')},
            data: {
                priOnlineId: priOnlineId,
                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});
                }
            }
        })
    }
});
// 关闭动作
src/main/webapp/static/js/priQuote/priQuote.js
@@ -88,13 +88,15 @@
        cellMinWidth: 150,
        cols: [[
            {type: 'checkbox', fixed: 'left'}
            ,{field: 'id', title: 'ID', sort: true,align: 'center', fixed: 'left', width: 80}
            ,{field: 'templateName', align: 'center',title: '模板名', width: 220, style: 'color: #1890ff;cursor:pointer', event: 'more',hide: false}
            ,{field: 'orderNum', align: 'center',title: '报价预算单号',hide: false}
            ,{field: 'id', title: 'ID', sort: true,align: 'center', fixed: 'left', width: 80,hide : true}
            ,{field: 'templateName', align: 'center',title: '客户名称', style: 'color: #1890ff;cursor:pointer', event: 'moreCstmr', width: 350,hide: false}
            ,{field: 'cstmrId$', align: 'center',title: '客户id',hide: true}
            ,{field: 'inOrderNum', align: 'center',title: '报价编号',hide: false}
            ,{field: 'planId$', align: 'center',title: '规划单号',hide: false}
            ,{field: 'orderNum', align: 'center',title: '报价预算单号',hide: false}
            ,{field: 'planId$', align: 'center',title: '规划单号', style: 'color: #1890ff;cursor:pointer', event: 'morePlan'}
            ,{field: 'itemId', align: 'center',title: '规划单号', hide: true}
            ,{field: 'planName$', align: 'center',title: '规划单名称',hide: false}
            ,{field: 'settle$', align: 'center',title: '进度', width: 150,hide: false}
            ,{field: 'settle$', align: 'center',title: '进度', style: 'color: #1890ff;cursor:pointer', event: 'more', width: 150,hide: false}
            ,{field: 'createTime$', align: 'center',title: '创建时间',hide: false}
            ,{field: 'updateTime$', align: 'center',title: '更新时间',hide: false}
            ,{field: 'memberId$', align: 'center',title: '业务员',hide: false}
@@ -240,6 +242,30 @@
    table.on('tool(priQuote)', function(obj){
        var data = obj.data;
        switch (obj.event) {
            case 'moreCstmr':
                top.cstmrByMore = data.cstmrId$;
                admin.popupRight({
                    type: 1,
                    window: "top",
                    area: "1250px",
                    url: "../cstmr/cstmr_more.html",
                    end: function () {
                        // $(".layui-laypage-btn")[0].click();
                    }
                })
                break;
            case 'morePlan':
                top.planByMore = data.itemId;
                admin.popupRight({
                    type: 1,
                    window: "top",
                    area: "1250px",
                    url: "../plan/plan_more_other.html",
                    end: function () {
                        // $(".layui-laypage-btn")[0].click();
                    }
                })
                break;
            case 'approval':
                layer.confirm('审批通过?', {
                    skin: 'layui-layer-admin',
src/main/webapp/static/js/priQuoteBudget/priQuoteBudget.js
@@ -82,15 +82,18 @@
        cellMinWidth: 150,
        cols: [[
            {type: 'checkbox', fixed: 'left'}
            ,{field: 'id', title: 'ID', sort: true,align: 'center', fixed: 'left', width: 80}
            ,{field: 'templateName', align: 'center',title: '模板名'}
            ,{field: 'orderNum', align: 'center',title: '产品费用明细单号'}
            ,{field: 'id', title: 'ID', sort: true,align: 'center', fixed: 'left', width: 80,hide : true}
            ,{field: 'templateName', align: 'center',title: '客户名称', style: 'color: #1890ff;cursor:pointer', event: 'moreCstmr', width: 350,hide: false}
            ,{field: 'cstmrId$', align: 'center',title: '客户id',hide: true}
            ,{field: 'inOrderNum', align: 'center',title: '预算编号'}
            ,{field: 'planId$', align: 'center',title: '规划单号'}
            ,{field: 'orderNum', align: 'center',title: '产品费用明细单号'}
            ,{field: 'planId$', align: 'center',title: '规划单号', style: 'color: #1890ff;cursor:pointer', event: 'morePlan'}
            ,{field: 'itemId', align: 'center',title: '规划单号', hide: true}
            ,{field: 'createTime$', align: 'center',title: '创建时间'}
            ,{field: 'updateTime$', align: 'center',title: '更新时间'}
            ,{field: 'memberId$', align: 'center',title: '业务员'}
            ,{field: 'userId$', align: 'center',title: '创建人员'}
            ,{field: 'settle$', align: 'center',title: '进度', style: 'color: #1890ff;cursor:pointer', event: 'more',hide: false}
            // ,{field: 'userId$', align: 'center',title: '创建人员'}
            ,{field: 'updateUserId$', align: 'center',title: '更新人员'}
            ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width:200}
        ]],
@@ -231,6 +234,53 @@
    table.on('tool(priQuoteBudget)', function(obj){
        var data = obj.data;
        switch (obj.event) {
            case 'approval':
                layer.confirm('审批通过?', {
                    skin: 'layui-layer-admin',
                    shade: .1,
                    offset: '200px',
                    title: data.name
                }, function (i) {
                    layer.close(i);
                    approval(data.id);
                });
                break;
            case 'more':
                top.priQuoteBudgetByMore = data.id;
                admin.popupRight({
                    type: 1,
                    window: "top",
                    area: "1250px",
                    url: "priQuoteBudget_more.html",
                    end: function () {
                        // $(".layui-laypage-btn")[0].click();
                    }
                })
                break;
            case 'moreCstmr':
                top.cstmrByMore = data.cstmrId$;
                admin.popupRight({
                    type: 1,
                    window: "top",
                    area: "1250px",
                    url: "../cstmr/cstmr_more.html",
                    end: function () {
                        // $(".layui-laypage-btn")[0].click();
                    }
                })
                break;
            case 'morePlan':
                top.planByMore = data.itemId;
                admin.popupRight({
                    type: 1,
                    window: "top",
                    area: "1250px",
                    url: "../plan/plan_more_other.html",
                    end: function () {
                        // $(".layui-laypage-btn")[0].click();
                    }
                })
                break;
            case "quoteBudget":
                layer.open({
                    type: 2,
@@ -354,6 +404,33 @@
        });
    }
    function approval(priQuoteBudgetId, plannerId, dIdx) {
        let loadIndex = layer.load(2);
        $.ajax({
            url: baseUrl+"/priQuoteBudget/approval/auth",
            headers: {'token': localStorage.getItem('token')},
            data: {
                priQuoteBudgetId: priQuoteBudgetId,
                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});
                }
            }
        })
    }
});
// 关闭动作
src/main/webapp/static/js/priSales/priSales.js
@@ -82,15 +82,18 @@
        cellMinWidth: 150,
        cols: [[
            {type: 'checkbox', fixed: 'left'}
            ,{field: 'id', title: 'ID', sort: true,align: 'center', fixed: 'left', width: 80}
            ,{field: 'templateName', align: 'center',title: '模板名'}
            ,{field: 'orderNum', align: 'center',title: '核价订单号'}
            ,{field: 'id', title: 'ID', sort: true,align: 'center', fixed: 'left', width: 80,hide : true}
            ,{field: 'templateName', align: 'center',title: '客户名称', style: 'color: #1890ff;cursor:pointer', event: 'moreCstmr', width: 350,hide: false}
            ,{field: 'cstmrId$', align: 'center',title: '客户id',hide: true}
            ,{field: 'inOrderNum', align: 'center',title: '明细编号'}
            ,{field: 'planId$', align: 'center',title: '项目名'}
            ,{field: 'orderNum', align: 'center',title: '核价单号'}
            ,{field: 'planId$', align: 'center',title: '规划单号', style: 'color: #1890ff;cursor:pointer', event: 'morePlan'}
            ,{field: 'itemId', align: 'center',title: '规划单号', hide: true}
            ,{field: 'createTime$', align: 'center',title: '创建时间'}
            ,{field: 'updateTime$', align: 'center',title: '更新时间'}
            ,{field: 'memberId$', align: 'center',title: '业务员'}
            ,{field: 'userId$', align: 'center',title: '创建人员'}
            ,{field: 'settle$', align: 'center',title: '进度', style: 'color: #1890ff;cursor:pointer', event: 'more',hide: false}
            // ,{field: 'userId$', align: 'center',title: '创建人员'}
            ,{field: 'updateUserId$', align: 'center',title: '更新人员'}
            ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width:250}
        ]],
@@ -231,6 +234,53 @@
    table.on('tool(priSales)', function(obj){
        var data = obj.data;
        switch (obj.event) {
            case 'approval':
                layer.confirm('审批通过?', {
                    skin: 'layui-layer-admin',
                    shade: .1,
                    offset: '200px',
                    title: data.name
                }, function (i) {
                    layer.close(i);
                    approval(data.id);
                });
                break;
            case 'more':
                top.priSalesByMore = data.id;
                admin.popupRight({
                    type: 1,
                    window: "top",
                    area: "1250px",
                    url: "priSales_more.html",
                    end: function () {
                        // $(".layui-laypage-btn")[0].click();
                    }
                })
                break;
            case 'moreCstmr':
                top.cstmrByMore = data.cstmrId$;
                admin.popupRight({
                    type: 1,
                    window: "top",
                    area: "1250px",
                    url: "../cstmr/cstmr_more.html",
                    end: function () {
                        // $(".layui-laypage-btn")[0].click();
                    }
                })
                break;
            case 'morePlan':
                top.planByMore = data.itemId;
                admin.popupRight({
                    type: 1,
                    window: "top",
                    area: "1250px",
                    url: "../plan/plan_more_other.html",
                    end: function () {
                        // $(".layui-laypage-btn")[0].click();
                    }
                })
                break;
            case "priOnline":
                layer.open({
                    type: 2,
@@ -357,6 +407,33 @@
        });
    }
    function approval(priSalesId, plannerId, dIdx) {
        let loadIndex = layer.load(2);
        $.ajax({
            url: baseUrl+"/priSales/approval/auth",
            headers: {'token': localStorage.getItem('token')},
            data: {
                priSalesId: priSalesId,
                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});
                }
            }
        })
    }
});
// 关闭动作
src/main/webapp/static/js/reimburseOnline/reimburseOnline.js
@@ -87,14 +87,14 @@
            {field: 'id', title: 'ID', sort: true,align: 'center', fixed: 'left', width: 80,hide: true}
            ,{field: 'templateName', align: 'center',title: '报销类型',hide: false}
            ,{field: 'checkData', align: 'center',title: '是否冲账',hide: false}
            ,{field: 'orderNum', align: 'center',title: '报销单号',width: 320, style: 'color: #1890ff;cursor:pointer', event: 'more',hide: false}
            ,{field: 'orderNum', align: 'center',title: '报销单号',width: 320,hide: false}
            ,{field: 'planId$', align: 'center',title: '项目号',hide: false}
            ,{field: 'name', align: 'center',title: '客户信息',hide: false}
            ,{field: 'settle', align: 'center',title: '进度',hide: false}
            ,{field: 'createTime$', align: 'center',title: '创建时间',hide: false}
            ,{field: 'updateTime$', align: 'center',title: '更新时间',hide: false}
            ,{field: 'status$', align: 'center',title: '状态',hide: false}
            ,{field: 'memberId$', align: 'center',title: '业务员',hide: false}
            ,{field: 'settle$', align: 'center',title: '进度', style: 'color: #1890ff;cursor:pointer', event: 'more',hide: false}
            ,{field: 'user$', align: 'center',title: '创建人员',hide: false}
            ,{field: 'updateUserId$', align: 'center',title: '更新人员',hide: false}
            // // ,{field: 'checkDataStatus$', align: 'center',title: '报价数据'}
src/main/webapp/views/businessTrip/businessTrip.html
@@ -72,7 +72,7 @@
<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" 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>
@@ -81,7 +81,7 @@
<script type="text/html" id="operate">
    {{# if (d.settle == 1) { }}
        <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-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>
@@ -273,7 +273,7 @@
        <div style="height: 10%">
            <hr class="layui-bg-gray">
            <div class="layui-form-item text-right" style="padding-right: 30px">
                <button class="layui-btn" lay-filter="editSubmit" lay-submit="">保存</button>
                <button class="layui-btn" lay-filter="editSubmit" lay-submit="">提交</button>
                <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
            </div>
        </div>
src/main/webapp/views/contract/contract.html
@@ -71,17 +71,29 @@
</script>
<script type="text/html" id="operate">
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a>
    {{# if (d.settle == 0) { }}
        <a class="layui-btn layui-btn-xs btn-edit" lay-event="approval">提交</a>
    {{# } }}
    {{# if (d.settle == 1) { }}
        <a class="layui-btn layui-btn-xs btn-edit" lay-event="approval">审批</a>
    {{# } }}
    {{# if (d.settle == 2) { }}
        <a class="layui-btn layui-btn-xs btn-edit" lay-event="approval">确认</a>
    {{# } }}
    {{# if (d.settle == 0 || d.settle == 1) { }}
        <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a>
        <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">编辑</a>
    {{# } }}
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="sales">合同明细</a>
    <a class="layui-btn layui-btn-xs btn-edit" lay-event="generate">生成合同</a>
    <a class="layui-btn layui-btn-xs btn-edit" lay-event="upload">上传合同</a>
    <a class="layui-btn layui-btn-xs btn-edit" lay-event="download">下载</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/handlebars/handlebars-v4.5.3.js"></script>
<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/contract/contract.js" charset="utf-8"></script>
</body>
src/main/webapp/views/contract/contract_more.html
New file
@@ -0,0 +1,187 @@
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<style>
    #formAdvForm {
        background-color: #f3f3f3;
    }
    #formAdvForm .layui-form-item {
        margin-top: 20px;
        margin-bottom: 0;
    }
    #formAdvForm .layui-form-item .layui-inline {
        margin-bottom: 25px;
        margin-right: 0;
    }
    .form-group-bottom {
        position: fixed;
        left: 0;
        right: 0;
        bottom: 0;
        padding: 10px 20px;
        background-color: #fff;
        box-shadow: 0 -1px 2px 0 rgba(0, 0, 0, .05);
    }
</style>
<!-- 正文开始 -->
<form class="layui-form" id="formAdvForm" lay-filter="formAdvForm" style="height: 100%">
    <div class="layui-fluid" style="padding-bottom: 75px;height: 100%; overflow: scroll;box-sizing: border-box">
        <!-- 标题 -->
        <div class="layui-card">
            <div class="layui-card-header" style="padding-top: 5px; padding-bottom: 5px">
                <div>
                    <i class="layui-icon" style="font-size: 20px;color: #1890ff;font-weight: bold">&#xe656;</i>
                    <span id="form-name" style="margin: 0 6px;font-size: 18px;font-weight: bold;letter-spacing: 1px"></span>
                    <span style="opacity: .5;font-size: small;margin-left: 5px">核价单</span>
                </div>
            </div>
            <div class="layui-card-body" style="padding: 30px 20px">
                <div class="layui-tab layui-steps">
                    <ul class="layui-tab-title" id="stepBox">
                    </ul>
                </div>
            </div>
        </div>
        <div class="layui-row">
            <!-- 数据 -->
            <!--            <div class="layui-col-md9">-->
            <!--                <div class="layui-card">-->
            <!--                    <div class="layui-card-header">-->
            <!--                        基本信息-->
            <!--                    </div>-->
            <!--                    <div class="layui-card-body">-->
            <!--                    </div>-->
            <!--                </div>-->
            <!--            </div>-->
            <!-- 动态 -->
            <!--            <div class="layui-col-md3" style="width: 24%;margin-left: 1%">-->
            <div class="layui-col-md3" style="width: 100%;">
                <!-- 时间线 -->
                <div class="layui-card">
                    <div class="layui-card-header">
                        <span>流程动态</span>
                    </div>
                    <div class="layui-card-body">
                        <ul class="layui-timeline" id="timelineBox">
                        </ul>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="form-group-bottom text-right">
        <button class="layui-btn" lay-filter="refresh" lay-submit><i class="layui-icon">&#xe666;</i>&emsp;刷新&emsp;</button>
    </div>
</form>
<script type="text/html" id="followerTabOperate">
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="del">删除</a>
</script>
<script type="text/template" id="stepTpl">
    {{#each list}}
    <li id="step-{{step}}" style="pointer-events: none">
        <i class="layui-icon layui-icon-ok">{{step}}</i>
        <span class="layui-steps-title">{{title}}</span>
        {{# if username}}
        <span class="layui-steps-content">{{username}}</span>
        {{ else }}
        <span class="layui-steps-content">&nbsp;</span>
        {{/if}}
    </li>
    {{/each}}
</script>
<script type="text/template" id="timelineTpl">
    {{#each list}}
    <li class="layui-timeline-item">
        <i class="layui-icon layui-timeline-axis">&#xe63f;</i>
        <div class="layui-timeline-content layui-text">
            <h4 class="layui-timeline-title" style="display: inline;margin-right: 10px;">{{title}}</h4>
            <span>{{time}}</span>
            <p>
                {{msg}}
            </p>
        </div>
    </li>
    {{/each}}
</script>
<script>
    var contractId = top.contractByMore;
    $('.layui-layer-close').hide();
    layui.config({
        base: baseUrl + "/static/layui/lay/modules/"
    }).extend({
        notice: 'notice/notice',
        steps: 'steps/steps',
    }).use(['form', 'table', 'laydate', 'notice', 'xmSelect', 'steps'], function () {
        var $ = layui.jquery;
        var form = layui.form;
        var table = layui.table;
        var laydate = layui.laydate;
        var notice = layui.notice;
        var xmSelect = layui.xmSelect;
        var steps = layui.steps;
        form.render('select');
        init();
        function init(){
            notice.msg('正在载入数据......', {icon: 4, position: "topRight"});
            $.ajax({
                url: baseUrl + "/contract/" + contractId + "/auth",
                headers: {'token': localStorage.getItem('token')},
                method: 'GET',
                success: function (res) {
                    notice.destroy();
                    if (res.code === 200) {
                        let contract = res.data;
                        top.contractByMore = null;
                        $("#form-name").html(contract.name);
                        // 进度步骤图
                        let template0 = Handlebars.compile($('#stepTpl').html());
                        $('#stepBox').html(template0({list: JSON.parse(contract.settleMsg)}));
                        $('#step-' + Number(contract.step)).addClass("layui-this");
                        let template1 = Handlebars.compile($('#timelineTpl').html());
                        $('#timelineBox').html(template1({list: JSON.parse(contract.settleMsg)}));
                        // 补充html
                        $('#customizeBox').html(contract.formHtml);
                        // 设备明细
                        // form.val('formAdvForm', contract);
                        // top.convertDisabled($('#formAdvForm :input'), true);
                        // 跟进人
                        // initFollowers(contract.id);
                        layDateRender();
                    } else if (res.code === 403) {
                        top.location.href = baseUrl + "/";
                    } else {
                        layer.msg(res.msg, {icon: 2})
                    }
                }
            })
        }
        /* 渲染laydate */
        function layDateRender() {
            laydate.render({
                elem: '#endTime',
                type: 'datetime'
            });
        }
        layDateRender();
        /* 监听表单提交 */
        form.on('submit(refresh)', function (data) {
            init();
            return false;
        });
    })
</script>
src/main/webapp/views/plan/plan_more_other.html
New file
@@ -0,0 +1,511 @@
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<style>
    #formAdvForm {
        background-color: #f3f3f3;
    }
    #formAdvForm .layui-form-item {
        margin-top: 20px;
        margin-bottom: 0;
    }
    #formAdvForm .layui-form-item .layui-inline {
        margin-bottom: 25px;
        margin-right: 0;
    }
    .form-group-bottom {
        position: fixed;
        left: 0;
        right: 0;
        bottom: 0;
        padding: 10px 20px;
        background-color: #fff;
        box-shadow: 0 -1px 2px 0 rgba(0, 0, 0, .05);
    }
    .card-body-item {
        display: inline-block;
        border-right: 1px solid #e0e0e0;
        width: 250px;
        padding: 0 30px 0 10px;
    }
    .header-desc {
        overflow:hidden;
        white-space: nowrap;
        text-overflow: ellipsis;
        -o-text-overflow:ellipsis;
    }
</style>
<!-- 正文开始 -->
<form class="layui-form" id="formAdvForm" lay-filter="formAdvForm" style="height: 100%">
    <div class="layui-fluid" style="padding-bottom: 75px;height: 100%; overflow: scroll;box-sizing: border-box">
        <!-- 标题 -->
        <div class="layui-card">
            <div class="layui-card-header" style="padding-top: 5px; padding-bottom: 5px">
                <div>
                    <i class="layui-icon" style="font-size: 20px;color: #1890ff;font-weight: bold">&#xe656;</i>
                    <span id="form-name" style="margin: 0 6px;font-size: 18px;font-weight: bold;letter-spacing: 1px"></span>
                    <span style="opacity: .5;font-size: small;margin-left: 5px">售前规划申请单</span>
                </div>
            </div>
<!--            <div class="layui-card-body" style="padding: 30px 20px">-->
<!--                <div class="layui-tab layui-steps">-->
<!--                    <ul class="layui-tab-title" id="stepBox">-->
<!--                    </ul>-->
<!--                </div>-->
<!--            </div>-->
        </div>
        <div class="layui-row">
            <!-- 数据 -->
            <div class="layui-col-md12">
                <div class="layui-card">
                    <div class="layui-card-header">
                        基本信息
                    </div>
                    <div class="layui-card-body">
                        <!-- 基本信息 -->
                        <div class="layui-form-item layui-row">
                            <input name="id" type="hidden" />
                            <div class="layui-inline layui-col-md6">
                                <label class="layui-form-label">规划单号:</label>
                                <div class="layui-input-block">
                                    <input name="uuid" class="layui-input" disabled />
                                </div>
                            </div>
                            <div class="layui-inline layui-col-md6">
                                <label class="layui-form-label">申请日期 :</label>
                                <div class="layui-input-block">
                                    <input name="appleTime$" class="layui-input" disabled />
                                </div>
                            </div>
                            <div class="layui-inline layui-col-md6">
                                <label class="layui-form-label">跟踪项目:</label>
                                <div class="layui-input-block">
                                    <input name="orderId$" class="layui-input" disabled />
                                </div>
                            </div>
                            <div class="layui-inline layui-col-md6">
                                <label class="layui-form-label">客户名称:</label>
                                <div class="layui-input-block">
                                    <input name="cstmrId$" class="layui-input" disabled />
                                </div>
                            </div>
                            <div class="layui-inline layui-col-md6">
                                <label class="layui-form-label">业务员:</label>
                                <div class="layui-input-block">
                                    <input name="userId$" class="layui-input" disabled />
                                </div>
                            </div>
                            <div class="layui-inline layui-col-md6">
                                <label class="layui-form-label">审批状态:</label>
                                <div class="layui-input-block">
                                    <input name="settle$" class="layui-input" disabled/>
                                </div>
                            </div>
                            <div class="layui-inline layui-col-md6">
                                <label class="layui-form-label">业务类型:</label>
                                <div class="layui-input-block">
                                    <input name="planType$" class="layui-input" disabled />
                                </div>
                            </div>
                        </div>
                        <!-- 其他 -->
                        <div class="layui-form-item layui-row">
                            <fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
                                <legend style="font-size: 13px">其他</legend>
                            </fieldset>
                            <div id="customizeBox" class="formDes">
                            </div>
                        </div>
                        <!-- 售前规划 -->
                        <div class="layui-form-item layui-row">
                            <fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
                                <legend style="font-size: 13px">售前规划</legend>
                            </fieldset>
                            <div class="layui-inline layui-col-md6">
                                <label class="layui-form-label">规划员:</label>
                                <div class="layui-input-block">
                                    <input name="planner" class="layui-input" disabled />
                                </div>
                            </div>
                            <div class="layui-inline layui-col-md6">
                                <label class="layui-form-label">完成时间:</label>
                                <div class="layui-input-block">
                                    <input name="finishTime$" class="layui-input" disabled />
                                </div>
                            </div>
                            <div class="layui-inline layui-col-md6">
                                <label class="layui-form-label">更改方案:</label>
                                <div class="layui-input-block">
                                    <input name="change" class="layui-input" disabled />
                                </div>
                            </div>
                            <div class="layui-inline layui-col-md6">
                                <label class="layui-form-label">更改次数:</label>
                                <div class="layui-input-block">
                                    <input name="changeTime" class="layui-input" disabled />
                                </div>
                            </div>
                            <div class="layui-inline layui-col-md6">
                                <label class="layui-form-label">更改原因:</label>
                                <div class="layui-input-block">
                                    <input name="changeReason" class="layui-input" disabled />
                                </div>
                            </div>
                            <div class="layui-inline layui-col-md6">
                                <label class="layui-form-label">规格奖金:</label>
                                <div class="layui-input-block">
                                    <input name="planBonus" class="layui-input" disabled />
                                </div>
                            </div>
                            <div class="layui-inline layui-col-md6">
                                <label class="layui-form-label">组长奖金:</label>
                                <div class="layui-input-block">
                                    <input name="planLeaderBonus" class="layui-input" disabled />
                                </div>
                            </div>
                        </div>
                        <!-- 系统信息 -->
                        <div class="layui-form-item layui-row">
                            <fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
                                <legend style="font-size: 13px">系统信息</legend>
                            </fieldset>
                            <div class="layui-inline layui-col-md6">
                                <label class="layui-form-label">添加人员:</label>
                                <div class="layui-input-block">
                                    <input name="createBy$" class="layui-input" disabled/>
                                </div>
                            </div>
                            <div class="layui-inline layui-col-md6">
                                <label class="layui-form-label">修改人员:</label>
                                <div class="layui-input-block">
                                    <input name="updateBy$" class="layui-input" disabled/>
                                </div>
                            </div>
                            <div class="layui-inline layui-col-md6">
                                <label class="layui-form-label">添加时间:</label>
                                <div class="layui-input-block">
                                    <input name="createTime$" class="layui-input icon-date" autocomplete="off" disabled/>
                                </div>
                            </div>
                            <div class="layui-inline layui-col-md6">
                                <label class="layui-form-label">修改时间:</label>
                                <div class="layui-input-block">
                                    <input name="updateTime$" class="layui-input icon-date" autocomplete="off" disabled/>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
            <!-- 动态 -->
<!--            <div class="layui-col-md3" style="width: 24%;margin-left: 1%">-->
                <!-- 时间线 -->
<!--                <div class="layui-card">-->
<!--                    <div class="layui-card-header">-->
<!--                        <span>售前规划清单</span>-->
<!--                    </div>-->
<!--                    <div class="layui-card-body">-->
<!--                        <ul class="layui-timeline" id="timelineBox">-->
<!--                        </ul>-->
<!--                    </div>-->
<!--                </div>-->
                <!-- 跟进人 -->
<!--                <div class="layui-card">-->
<!--                    <div class="layui-card-header">-->
<!--                        <span>跟进人</span>-->
<!--                        <span lay-filter="followerAdd" lay-submit style="float: right;cursor: pointer;">-->
<!--                            <i class="layui-icon" style="font-size: 20px;color: #1890ff;">&#xe61f;</i>-->
<!--                        </span>-->
<!--                    </div>-->
<!--                    <div class="layui-card-body">-->
<!--                        <table id="followersTable" lay-filter="followersTable"></table>-->
<!--                    </div>-->
<!--                </div>-->
<!--            </div>-->
        </div>
    </div>
    <div class="form-group-bottom text-right">
        <button class="layui-btn" lay-filter="refresh" lay-submit><i class="layui-icon">&#xe666;</i>&emsp;刷新&emsp;</button>
    </div>
</form>
<script type="text/html" id="followerTabOperate">
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="del">删除</a>
</script>
<!-- 跟进人 -->
<script type="text/html" id="followerEditDialog">
    <form id="followerEditForm" lay-filter="followerEditForm" class="layui-form model-form">
        <input name="experimentId" type="hidden"/>
        <div class="layui-form-item" style="float: left;clear: none;margin-right: 20px">
            <label class="layui-form-label">选择成员</label>
            <div class="layui-input-block">
                <div id="followersBox" name="followersBox">
                </div>
            </div>
        </div>
        <div class="layui-form-item text-right" style="float: left;clear: none">
            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
            <button class="layui-btn" lay-filter="followerSubmit" lay-submit>保存</button>
        </div>
    </form>
</script>
<script type="text/template" id="stepTpl">
    {{#each list}}
    <li id="step-{{step}}" style="pointer-events: none">
        <i class="layui-icon layui-icon-ok">{{step}}</i>
        <span class="layui-steps-title">{{title}}</span>
        {{# if username}}
        <span class="layui-steps-content">{{username}}</span>
        {{ else }}
        <span class="layui-steps-content">&nbsp;</span>
        {{/if}}
    </li>
    {{/each}}
</script>
<script type="text/template" id="timelineTpl">
    {{#each list}}
    <li class="layui-timeline-item">
        <i class="layui-icon layui-timeline-axis">&#xe63f;</i>
        <div class="layui-timeline-content layui-text">
            <h4 class="layui-timeline-title" style="display: inline;margin-right: 10px;">{{title}}</h4>
            <span>{{time}}</span>
            <p>
                {{msg}}
            </p>
        </div>
    </li>
    {{/each}}
</script>
<script>
    var planId = top.planByMore;
    $('.layui-layer-close').hide();
    layui.config({
        base: baseUrl + "/static/layui/lay/modules/"
    }).extend({
        notice: 'notice/notice',
        steps: 'steps/steps',
    }).use(['form', 'table', 'laydate', 'notice', 'xmSelect', 'steps'], function () {
        var $ = layui.jquery;
        var form = layui.form;
        var table = layui.table;
        var laydate = layui.laydate;
        var notice = layui.notice;
        var xmSelect = layui.xmSelect;
        var steps = layui.steps;
        form.render('select');
        init();
        function init(){
            notice.msg('正在载入数据......', {icon: 4, position: "topRight"});
            $.ajax({
                url: baseUrl + "/plan/" + planId + "/auth",
                headers: {'token': localStorage.getItem('token')},
                method: 'GET',
                success: function (res) {
                    notice.destroy();
                    if (res.code === 200) {
                        let plan = res.data;
                        top.planByMore = null;
                        $("#form-name").html(plan.name);
                        // 进度步骤图
                        let template0 = Handlebars.compile($('#stepTpl').html());
                        $('#stepBox').html(template0({list: JSON.parse(plan.settleMsg)}));
                        $('#step-' + Number(plan.step)).addClass("layui-this");
                        let template1 = Handlebars.compile($('#timelineTpl').html());
                        $('#timelineBox').html(template1({list: JSON.parse(plan.settleMsg)}));
                        // 补充html
                        $('#customizeBox').html(plan.formHtml);
                        // 设备明细
                        form.val('formAdvForm', plan);
                        top.convertDisabled($('#formAdvForm :input'), true);
                        // 跟进人
                        // initFollowers(plan.id);
                        layDateRender();
                    } else if (res.code === 403) {
                        top.location.href = baseUrl + "/";
                    } else {
                        layer.msg(res.msg, {icon: 2})
                    }
                }
            })
        }
        /* 渲染laydate */
        function layDateRender() {
            laydate.render({
                elem: '#endTime',
                type: 'datetime'
            });
        }
        layDateRender();
        // 渲染跟进人模块
        function initFollowers(planId) {
            if (!planId) {
                return;
            }
            $.ajax({
                url: baseUrl+"/plan/followers/table/auth",
                headers: {'token': localStorage.getItem('token')},
                data: {
                    planId: planId
                },
                method: 'GET',
                success: function (res) {
                    if (res.code === 200){
                        var follTab = table.render({
                            elem: '#followersTable',
                            data: res.data,
                            limit: 999,
                            height: 'full-408',
                            cols: [[
                                {field: 'userName', title: '工作人员'},
                                {fixed: 'right', title:'', align: 'center', toolbar: '#followerTabOperate', width: 70}
                            ]],
                            done: function (res, curr, count) {
                                $('#dictTable+.layui-table-view .layui-table-body tbody>tr:first').trigger('click');
                            }
                        });
                        // 监听行工具事件
                        table.on('tool(followersTable)', function(obj){
                            let data = obj.data;
                            switch (obj.event) {
                                case "del":
                                    let loadIndex = layer.load(2);
                                    $.ajax({
                                        url: baseUrl+"/plan/followers/remove/auth",
                                        headers: {'token': localStorage.getItem('token')},
                                        data: {
                                            planId: planId,
                                            userId: data.userId
                                        },
                                        method: 'POST',
                                        success: function (res) {
                                            layer.close(loadIndex);
                                            if (res.code === 200){
                                                initFollowers(planId);
                                            } else if (res.code === 403){
                                                top.location.href = baseUrl+"/";
                                            } else {
                                                layer.msg(res.msg, {icon: 2});
                                            }
                                        }
                                    })
                                    break;
                            }
                        });
                    } else if (res.code === 403){
                        top.location.href = baseUrl+"/";
                    }else {
                        layer.msg(res.msg, {icon: 2})
                    }
                }
            })
        }
        // 添加跟进人
        var followerLayer;
        form.on('submit(followerAdd)', function (data) {
            if (followerLayer) {return;}
            followerLayer = admin.open({
                type: 1,
                offset: '150px',
                area: '600px',
                title: '添加跟进人',
                content: $('#followerEditDialog').html(),
                success: function (layero, dIndex) {
                    // 表单提交事件
                    form.on('submit(followerSubmit)', function (data) {
                        let selectList = xmSelectIdx.getValue();
                        if (selectList.length === 0) {
                            layer.msg("请选择至少一条数据", {icon: 3});
                            return false;
                        }
                        let loadIndex = layer.load(2);
                        $.ajax({
                            url: baseUrl+"/plan/followers/add/auth",
                            headers: {'token': localStorage.getItem('token')},
                            data: {
                                planId: planId,
                                followerIds: selectList.map(function (d) {
                                    return d.value;
                                })
                            },
                            method: 'POST',
                            success: function (res) {
                                if (res.code === 200){
                                    layer.close(loadIndex);
                                    initFollowers(planId);
                                } else if (res.code === 403){
                                    top.location.href = baseUrl+"/";
                                }else {
                                    layer.msg(res.msg, {icon: 2})
                                }
                            }
                        })
                        layer.close(dIndex);
                        return false;
                    });
                    let xmSelectIdx = xmSelect.render({
                        el: '#followersBox',
                        style: {
                            width: '280px',
                        },
                        autoRow: true,
                        toolbar: { show: true },
                        filterable: true,
                        remoteSearch: 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});
                                    }
                                }
                            });
                        }
                    })
                    // 弹窗不出现滚动条
                    $(layero).children('.layui-layer-content').css('overflow', 'visible');
                    layui.form.render('select');
                },
                end: function () {
                    followerLayer = null;
                }
            })
        });
        /* 监听表单提交 */
        form.on('submit(refresh)', function (data) {
            init();
            return false;
        });
    })
</script>
src/main/webapp/views/priOnline2/priOnline.html
@@ -73,11 +73,22 @@
<script type="text/html" id="operate">
  {{# if (d.settle == 0) { }}
    <a class="layui-btn layui-btn-xs btn-edit" lay-event="approval">提交</a>
  {{# } }}
  {{# if (d.settle == 1) { }}
    <a class="layui-btn layui-btn-xs btn-edit" lay-event="approval">审批</a>
  {{# } }}
  {{# if (d.settle == 2) { }}
    <a class="layui-btn layui-btn-xs btn-edit" lay-event="approval">确认</a>
  {{# } }}
  {{# if (d.settle == 0 || d.settle == 1) { }}
    <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a>
  {{# } }}
  <a class="layui-btn layui-btn-xs btn-edit" lay-event="check">核价</a>
  <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">编辑</a>
  <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="upload">上传询价</a>
  <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="viewCheck">查看询价</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>
@@ -85,6 +96,7 @@
<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/handlebars/handlebars-v4.5.3.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/priOnline2/priOnline.js" charset="utf-8"></script>
src/main/webapp/views/priOnline2/priOnline_more.html
New file
@@ -0,0 +1,187 @@
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<style>
    #formAdvForm {
        background-color: #f3f3f3;
    }
    #formAdvForm .layui-form-item {
        margin-top: 20px;
        margin-bottom: 0;
    }
    #formAdvForm .layui-form-item .layui-inline {
        margin-bottom: 25px;
        margin-right: 0;
    }
    .form-group-bottom {
        position: fixed;
        left: 0;
        right: 0;
        bottom: 0;
        padding: 10px 20px;
        background-color: #fff;
        box-shadow: 0 -1px 2px 0 rgba(0, 0, 0, .05);
    }
</style>
<!-- 正文开始 -->
<form class="layui-form" id="formAdvForm" lay-filter="formAdvForm" style="height: 100%">
    <div class="layui-fluid" style="padding-bottom: 75px;height: 100%; overflow: scroll;box-sizing: border-box">
        <!-- 标题 -->
        <div class="layui-card">
            <div class="layui-card-header" style="padding-top: 5px; padding-bottom: 5px">
                <div>
                    <i class="layui-icon" style="font-size: 20px;color: #1890ff;font-weight: bold">&#xe656;</i>
                    <span id="form-name" style="margin: 0 6px;font-size: 18px;font-weight: bold;letter-spacing: 1px"></span>
                    <span style="opacity: .5;font-size: small;margin-left: 5px">核价单</span>
                </div>
            </div>
            <div class="layui-card-body" style="padding: 30px 20px">
                <div class="layui-tab layui-steps">
                    <ul class="layui-tab-title" id="stepBox">
                    </ul>
                </div>
            </div>
        </div>
        <div class="layui-row">
            <!-- 数据 -->
            <!--            <div class="layui-col-md9">-->
            <!--                <div class="layui-card">-->
            <!--                    <div class="layui-card-header">-->
            <!--                        基本信息-->
            <!--                    </div>-->
            <!--                    <div class="layui-card-body">-->
            <!--                    </div>-->
            <!--                </div>-->
            <!--            </div>-->
            <!-- 动态 -->
            <!--            <div class="layui-col-md3" style="width: 24%;margin-left: 1%">-->
            <div class="layui-col-md3" style="width: 100%;">
                <!-- 时间线 -->
                <div class="layui-card">
                    <div class="layui-card-header">
                        <span>流程动态</span>
                    </div>
                    <div class="layui-card-body">
                        <ul class="layui-timeline" id="timelineBox">
                        </ul>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="form-group-bottom text-right">
        <button class="layui-btn" lay-filter="refresh" lay-submit><i class="layui-icon">&#xe666;</i>&emsp;刷新&emsp;</button>
    </div>
</form>
<script type="text/html" id="followerTabOperate">
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="del">删除</a>
</script>
<script type="text/template" id="stepTpl">
    {{#each list}}
    <li id="step-{{step}}" style="pointer-events: none">
        <i class="layui-icon layui-icon-ok">{{step}}</i>
        <span class="layui-steps-title">{{title}}</span>
        {{# if username}}
        <span class="layui-steps-content">{{username}}</span>
        {{ else }}
        <span class="layui-steps-content">&nbsp;</span>
        {{/if}}
    </li>
    {{/each}}
</script>
<script type="text/template" id="timelineTpl">
    {{#each list}}
    <li class="layui-timeline-item">
        <i class="layui-icon layui-timeline-axis">&#xe63f;</i>
        <div class="layui-timeline-content layui-text">
            <h4 class="layui-timeline-title" style="display: inline;margin-right: 10px;">{{title}}</h4>
            <span>{{time}}</span>
            <p>
                {{msg}}
            </p>
        </div>
    </li>
    {{/each}}
</script>
<script>
    var priOnlineId = top.priOnlineByMore;
    $('.layui-layer-close').hide();
    layui.config({
        base: baseUrl + "/static/layui/lay/modules/"
    }).extend({
        notice: 'notice/notice',
        steps: 'steps/steps',
    }).use(['form', 'table', 'laydate', 'notice', 'xmSelect', 'steps'], function () {
        var $ = layui.jquery;
        var form = layui.form;
        var table = layui.table;
        var laydate = layui.laydate;
        var notice = layui.notice;
        var xmSelect = layui.xmSelect;
        var steps = layui.steps;
        form.render('select');
        init();
        function init(){
            notice.msg('正在载入数据......', {icon: 4, position: "topRight"});
            $.ajax({
                url: baseUrl + "/priOnline2/" + priOnlineId + "/auth",
                headers: {'token': localStorage.getItem('token')},
                method: 'GET',
                success: function (res) {
                    notice.destroy();
                    if (res.code === 200) {
                        let priOnline = res.data;
                        top.priOnlineByMore = null;
                        $("#form-name").html(priOnline.name);
                        // 进度步骤图
                        let template0 = Handlebars.compile($('#stepTpl').html());
                        $('#stepBox').html(template0({list: JSON.parse(priOnline.settleMsg)}));
                        $('#step-' + Number(priOnline.step)).addClass("layui-this");
                        let template1 = Handlebars.compile($('#timelineTpl').html());
                        $('#timelineBox').html(template1({list: JSON.parse(priOnline.settleMsg)}));
                        // 补充html
                        $('#customizeBox').html(priOnline.formHtml);
                        // 设备明细
                        // form.val('formAdvForm', priOnline);
                        // top.convertDisabled($('#formAdvForm :input'), true);
                        // 跟进人
                        // initFollowers(priOnline.id);
                        layDateRender();
                    } else if (res.code === 403) {
                        top.location.href = baseUrl + "/";
                    } else {
                        layer.msg(res.msg, {icon: 2})
                    }
                }
            })
        }
        /* 渲染laydate */
        function layDateRender() {
            laydate.render({
                elem: '#endTime',
                type: 'datetime'
            });
        }
        layDateRender();
        /* 监听表单提交 */
        form.on('submit(refresh)', function (data) {
            init();
            return false;
        });
    })
</script>
src/main/webapp/views/priQuoteBudget/priQuoteBudget.html
@@ -9,6 +9,8 @@
    <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/layui/lay/modules/formDesigner/coolForm.css" />
    <link rel="stylesheet" href="../../static/css/tree.css" media="all">
    <style>
        .nav-box {
            position: absolute;
@@ -98,15 +100,27 @@
</script>
<script type="text/html" id="operate">
    {{# if (d.settle == 0) { }}
        <a class="layui-btn layui-btn-xs btn-edit" lay-event="approval">提交</a>
    {{# } }}
    {{# if (d.settle == 1) { }}
        <a class="layui-btn layui-btn-xs btn-edit" lay-event="approval">审批</a>
    {{# } }}
    {{# if (d.settle == 2) { }}
        <a class="layui-btn layui-btn-xs btn-edit" lay-event="approval">确认</a>
    {{# } }}
    {{# if (d.settle == 0 || d.settle == 1) { }}
        <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a>
        <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">编辑</a>
    {{# } }}
    <a class="layui-btn layui-btn-xs btn-edit" lay-event="quoteBudget">报价预算</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/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/handlebars/handlebars-v4.5.3.js"></script>
<script type="text/javascript" src="../../static/js/priQuoteBudget/priQuoteBudget.js" charset="utf-8"></script>
<!-- 表单弹窗 -->
<script type="text/html" id="editDialog">
@@ -127,12 +141,12 @@
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">项目名: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" id="planId" disabled placeholder="请输入项目名" autocomplete="off" 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="name" disabled placeholder="请输入项目名" autocomplete="off" lay-verify="required">-->
<!--                    </div>-->
<!--                </div>-->
                <div class="layui-form-item">
                    <label class="layui-form-label">核价单号: </label>
src/main/webapp/views/priQuoteBudget/priQuoteBudget_more.html
New file
@@ -0,0 +1,187 @@
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<style>
    #formAdvForm {
        background-color: #f3f3f3;
    }
    #formAdvForm .layui-form-item {
        margin-top: 20px;
        margin-bottom: 0;
    }
    #formAdvForm .layui-form-item .layui-inline {
        margin-bottom: 25px;
        margin-right: 0;
    }
    .form-group-bottom {
        position: fixed;
        left: 0;
        right: 0;
        bottom: 0;
        padding: 10px 20px;
        background-color: #fff;
        box-shadow: 0 -1px 2px 0 rgba(0, 0, 0, .05);
    }
</style>
<!-- 正文开始 -->
<form class="layui-form" id="formAdvForm" lay-filter="formAdvForm" style="height: 100%">
    <div class="layui-fluid" style="padding-bottom: 75px;height: 100%; overflow: scroll;box-sizing: border-box">
        <!-- 标题 -->
        <div class="layui-card">
            <div class="layui-card-header" style="padding-top: 5px; padding-bottom: 5px">
                <div>
                    <i class="layui-icon" style="font-size: 20px;color: #1890ff;font-weight: bold">&#xe656;</i>
                    <span id="form-name" style="margin: 0 6px;font-size: 18px;font-weight: bold;letter-spacing: 1px"></span>
                    <span style="opacity: .5;font-size: small;margin-left: 5px">核价单</span>
                </div>
            </div>
            <div class="layui-card-body" style="padding: 30px 20px">
                <div class="layui-tab layui-steps">
                    <ul class="layui-tab-title" id="stepBox">
                    </ul>
                </div>
            </div>
        </div>
        <div class="layui-row">
            <!-- 数据 -->
            <!--            <div class="layui-col-md9">-->
            <!--                <div class="layui-card">-->
            <!--                    <div class="layui-card-header">-->
            <!--                        基本信息-->
            <!--                    </div>-->
            <!--                    <div class="layui-card-body">-->
            <!--                    </div>-->
            <!--                </div>-->
            <!--            </div>-->
            <!-- 动态 -->
            <!--            <div class="layui-col-md3" style="width: 24%;margin-left: 1%">-->
            <div class="layui-col-md3" style="width: 100%;">
                <!-- 时间线 -->
                <div class="layui-card">
                    <div class="layui-card-header">
                        <span>流程动态</span>
                    </div>
                    <div class="layui-card-body">
                        <ul class="layui-timeline" id="timelineBox">
                        </ul>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="form-group-bottom text-right">
        <button class="layui-btn" lay-filter="refresh" lay-submit><i class="layui-icon">&#xe666;</i>&emsp;刷新&emsp;</button>
    </div>
</form>
<script type="text/html" id="followerTabOperate">
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="del">删除</a>
</script>
<script type="text/template" id="stepTpl">
    {{#each list}}
    <li id="step-{{step}}" style="pointer-events: none">
        <i class="layui-icon layui-icon-ok">{{step}}</i>
        <span class="layui-steps-title">{{title}}</span>
        {{# if username}}
        <span class="layui-steps-content">{{username}}</span>
        {{ else }}
        <span class="layui-steps-content">&nbsp;</span>
        {{/if}}
    </li>
    {{/each}}
</script>
<script type="text/template" id="timelineTpl">
    {{#each list}}
    <li class="layui-timeline-item">
        <i class="layui-icon layui-timeline-axis">&#xe63f;</i>
        <div class="layui-timeline-content layui-text">
            <h4 class="layui-timeline-title" style="display: inline;margin-right: 10px;">{{title}}</h4>
            <span>{{time}}</span>
            <p>
                {{msg}}
            </p>
        </div>
    </li>
    {{/each}}
</script>
<script>
    var priQuoteBudgetId = top.priQuoteBudgetByMore;
    $('.layui-layer-close').hide();
    layui.config({
        base: baseUrl + "/static/layui/lay/modules/"
    }).extend({
        notice: 'notice/notice',
        steps: 'steps/steps',
    }).use(['form', 'table', 'laydate', 'notice', 'xmSelect', 'steps'], function () {
        var $ = layui.jquery;
        var form = layui.form;
        var table = layui.table;
        var laydate = layui.laydate;
        var notice = layui.notice;
        var xmSelect = layui.xmSelect;
        var steps = layui.steps;
        form.render('select');
        init();
        function init(){
            notice.msg('正在载入数据......', {icon: 4, position: "topRight"});
            $.ajax({
                url: baseUrl + "/priQuoteBudget/" + priQuoteBudgetId + "/auth",
                headers: {'token': localStorage.getItem('token')},
                method: 'GET',
                success: function (res) {
                    notice.destroy();
                    if (res.code === 200) {
                        let priQuoteBudget = res.data;
                        top.priQuoteBudgetByMore = null;
                        $("#form-name").html(priQuoteBudget.name);
                        // 进度步骤图
                        let template0 = Handlebars.compile($('#stepTpl').html());
                        $('#stepBox').html(template0({list: JSON.parse(priQuoteBudget.settleMsg)}));
                        $('#step-' + Number(priQuoteBudget.step)).addClass("layui-this");
                        let template1 = Handlebars.compile($('#timelineTpl').html());
                        $('#timelineBox').html(template1({list: JSON.parse(priQuoteBudget.settleMsg)}));
                        // 补充html
                        $('#customizeBox').html(priQuoteBudget.formHtml);
                        // 设备明细
                        // form.val('formAdvForm', priQuoteBudget);
                        // top.convertDisabled($('#formAdvForm :input'), true);
                        // 跟进人
                        // initFollowers(priQuoteBudget.id);
                        layDateRender();
                    } else if (res.code === 403) {
                        top.location.href = baseUrl + "/";
                    } else {
                        layer.msg(res.msg, {icon: 2})
                    }
                }
            })
        }
        /* 渲染laydate */
        function layDateRender() {
            laydate.render({
                elem: '#endTime',
                type: 'datetime'
            });
        }
        layDateRender();
        /* 监听表单提交 */
        form.on('submit(refresh)', function (data) {
            init();
            return false;
        });
    })
</script>
src/main/webapp/views/priSales/priSales.html
@@ -9,6 +9,8 @@
  <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/layui/lay/modules/formDesigner/coolForm.css" />
  <link rel="stylesheet" href="../../static/css/tree.css" media="all">
  <style>
    .nav-box {
      position: absolute;
@@ -98,14 +100,26 @@
</script>
<script type="text/html" id="operate">
  <a class="layui-btn layui-btn-xs btn-edit" lay-event="priOnline">产品费用明细</a>
  <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">编辑</a>
  {{# if (d.settle == 0) { }}
  <a class="layui-btn layui-btn-xs btn-edit" lay-event="approval">提交</a>
  {{# } }}
  {{# if (d.settle == 1) { }}
  <a class="layui-btn layui-btn-xs btn-edit" lay-event="approval">审批</a>
  {{# } }}
  {{# if (d.settle == 2) { }}
  <a class="layui-btn layui-btn-xs btn-edit" lay-event="approval">确认</a>
  {{# } }}
  {{# if (d.settle == 0 || d.settle == 1) { }}
  <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a>
  <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">编辑</a>
  {{# } }}
  <a class="layui-btn layui-btn-xs btn-edit" lay-event="priOnline">产品费用明细</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/handlebars/handlebars-v4.5.3.js"></script>
<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/priSales/priSales.js" charset="utf-8"></script>
<!-- 表单弹窗 -->
@@ -115,24 +129,30 @@
    <div class="layui-row">
      <div class="layui-col-md12">
        <div class="layui-form-item">
          <label class="layui-form-label layui-form-required">订单号: </label>
          <label class="layui-form-label layui-form-required">核价单号: </label>
          <div class="layui-input-block cool-auto-complete">
            <input class="layui-input" name="id" placeholder="请输入订单号" style="display: none" lay-verify="required">
            <input id="orderNum" name="orderNum" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入订单号" onfocus=this.blur()>
            <input class="layui-input" name="id" placeholder="请输入核价单号" style="display: none" lay-verify="required">
            <input id="orderNum" name="orderNum" 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="priOnlineQueryBydirector" onkeyup="autoLoad(this.getAttribute('data-key'))">
              <select class="cool-auto-complete-window-select" data-key="priOnlineQueryBydirectorSelect" onchange="confirmed(this.getAttribute('data-key'),getItemInfo)" multiple="multiple">
              <input class="cool-auto-complete-window-input" data-key="priOnline2QueryBydirector" onkeyup="autoLoad(this.getAttribute('data-key'))">
              <select class="cool-auto-complete-window-select" data-key="priOnline2QueryBydirectorSelect" onchange="confirmed(this.getAttribute('data-key'),getItemInfo)" 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" id="planId" disabled placeholder="请输入项目名" autocomplete="off" 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" id="planId" disabled placeholder="请输入项目名" autocomplete="off" 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" id="planId" type="text" name="planId" placeholder="请输入项目名" autocomplete="off">-->
<!--          </div>-->
<!--        </div>-->
      </div>
    </div>
src/main/webapp/views/priSales/priSales_more.html
New file
@@ -0,0 +1,187 @@
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<style>
    #formAdvForm {
        background-color: #f3f3f3;
    }
    #formAdvForm .layui-form-item {
        margin-top: 20px;
        margin-bottom: 0;
    }
    #formAdvForm .layui-form-item .layui-inline {
        margin-bottom: 25px;
        margin-right: 0;
    }
    .form-group-bottom {
        position: fixed;
        left: 0;
        right: 0;
        bottom: 0;
        padding: 10px 20px;
        background-color: #fff;
        box-shadow: 0 -1px 2px 0 rgba(0, 0, 0, .05);
    }
</style>
<!-- 正文开始 -->
<form class="layui-form" id="formAdvForm" lay-filter="formAdvForm" style="height: 100%">
    <div class="layui-fluid" style="padding-bottom: 75px;height: 100%; overflow: scroll;box-sizing: border-box">
        <!-- 标题 -->
        <div class="layui-card">
            <div class="layui-card-header" style="padding-top: 5px; padding-bottom: 5px">
                <div>
                    <i class="layui-icon" style="font-size: 20px;color: #1890ff;font-weight: bold">&#xe656;</i>
                    <span id="form-name" style="margin: 0 6px;font-size: 18px;font-weight: bold;letter-spacing: 1px"></span>
                    <span style="opacity: .5;font-size: small;margin-left: 5px">核价单</span>
                </div>
            </div>
            <div class="layui-card-body" style="padding: 30px 20px">
                <div class="layui-tab layui-steps">
                    <ul class="layui-tab-title" id="stepBox">
                    </ul>
                </div>
            </div>
        </div>
        <div class="layui-row">
            <!-- 数据 -->
            <!--            <div class="layui-col-md9">-->
            <!--                <div class="layui-card">-->
            <!--                    <div class="layui-card-header">-->
            <!--                        基本信息-->
            <!--                    </div>-->
            <!--                    <div class="layui-card-body">-->
            <!--                    </div>-->
            <!--                </div>-->
            <!--            </div>-->
            <!-- 动态 -->
            <!--            <div class="layui-col-md3" style="width: 24%;margin-left: 1%">-->
            <div class="layui-col-md3" style="width: 100%;">
                <!-- 时间线 -->
                <div class="layui-card">
                    <div class="layui-card-header">
                        <span>流程动态</span>
                    </div>
                    <div class="layui-card-body">
                        <ul class="layui-timeline" id="timelineBox">
                        </ul>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="form-group-bottom text-right">
        <button class="layui-btn" lay-filter="refresh" lay-submit><i class="layui-icon">&#xe666;</i>&emsp;刷新&emsp;</button>
    </div>
</form>
<script type="text/html" id="followerTabOperate">
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="del">删除</a>
</script>
<script type="text/template" id="stepTpl">
    {{#each list}}
    <li id="step-{{step}}" style="pointer-events: none">
        <i class="layui-icon layui-icon-ok">{{step}}</i>
        <span class="layui-steps-title">{{title}}</span>
        {{# if username}}
        <span class="layui-steps-content">{{username}}</span>
        {{ else }}
        <span class="layui-steps-content">&nbsp;</span>
        {{/if}}
    </li>
    {{/each}}
</script>
<script type="text/template" id="timelineTpl">
    {{#each list}}
    <li class="layui-timeline-item">
        <i class="layui-icon layui-timeline-axis">&#xe63f;</i>
        <div class="layui-timeline-content layui-text">
            <h4 class="layui-timeline-title" style="display: inline;margin-right: 10px;">{{title}}</h4>
            <span>{{time}}</span>
            <p>
                {{msg}}
            </p>
        </div>
    </li>
    {{/each}}
</script>
<script>
    var priSalesId = top.priSalesByMore;
    $('.layui-layer-close').hide();
    layui.config({
        base: baseUrl + "/static/layui/lay/modules/"
    }).extend({
        notice: 'notice/notice',
        steps: 'steps/steps',
    }).use(['form', 'table', 'laydate', 'notice', 'xmSelect', 'steps'], function () {
        var $ = layui.jquery;
        var form = layui.form;
        var table = layui.table;
        var laydate = layui.laydate;
        var notice = layui.notice;
        var xmSelect = layui.xmSelect;
        var steps = layui.steps;
        form.render('select');
        init();
        function init(){
            notice.msg('正在载入数据......', {icon: 4, position: "topRight"});
            $.ajax({
                url: baseUrl + "/priSales/" + priSalesId + "/auth",
                headers: {'token': localStorage.getItem('token')},
                method: 'GET',
                success: function (res) {
                    notice.destroy();
                    if (res.code === 200) {
                        let priSales = res.data;
                        top.priSalesByMore = null;
                        $("#form-name").html(priSales.name);
                        // 进度步骤图
                        let template0 = Handlebars.compile($('#stepTpl').html());
                        $('#stepBox').html(template0({list: JSON.parse(priSales.settleMsg)}));
                        $('#step-' + Number(priSales.step)).addClass("layui-this");
                        let template1 = Handlebars.compile($('#timelineTpl').html());
                        $('#timelineBox').html(template1({list: JSON.parse(priSales.settleMsg)}));
                        // 补充html
                        $('#customizeBox').html(priSales.formHtml);
                        // 设备明细
                        // form.val('formAdvForm', priSales);
                        // top.convertDisabled($('#formAdvForm :input'), true);
                        // 跟进人
                        // initFollowers(priSales.id);
                        layDateRender();
                    } else if (res.code === 403) {
                        top.location.href = baseUrl + "/";
                    } else {
                        layer.msg(res.msg, {icon: 2})
                    }
                }
            })
        }
        /* 渲染laydate */
        function layDateRender() {
            laydate.render({
                elem: '#endTime',
                type: 'datetime'
            });
        }
        layDateRender();
        /* 监听表单提交 */
        form.on('submit(refresh)', function (data) {
            init();
            return false;
        });
    })
</script>
src/main/webapp/views/processPermissions/processPermissions.html
@@ -32,7 +32,7 @@
                                <option value="2">报价流程</option>
                                <option value="3">报销流程</option>
<!--                                <option value="4">出差流程</option>-->
<!--                                <option value="5">合同审批</option>-->
                                <option value="7">合同管理</option>
                            </select>
                        </div>
                    </div>
@@ -158,34 +158,35 @@
<!--                        <input class="layui-input" name="standby6" placeholder="请输入备用字段6">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">权限类型: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <select name="processMemo" lay-vertype="tips" lay-verify="required">-->
<!--                            <option value="">请选择状态</option>-->
<!--                            <option value="1">核价流程</option>-->
<!--                            <option value="2">报价流程</option>-->
<!--                            <option value="3">报销流程</option>-->
<!--                            <option value="4">出差流程</option>-->
<!--                        </select>-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">权限节点: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <select name="process" lay-vertype="tips" lay-verify="required">-->
<!--                            <option value="">请选择状态</option>-->
<!--                            <option value="1-1">1-1</option>-->
<!--                            <option value="2-1">2-1</option>-->
<!--                            <option value="3-1">3-1</option>-->
<!--                            <option value="3-2">3-2</option>-->
<!--                            <option value="4-1">4-1</option>-->
<!--                            <option value="5-1">5-1</option>-->
<!--                            <option value="6-1">6-1</option>-->
<!--                            <option value="7-1">7-1</option>-->
<!--                        </select>-->
<!--                    </div>-->
<!--                </div>-->
                <div class="layui-form-item">
                    <label class="layui-form-label layui-form-required">权限类型: </label>
                    <div class="layui-input-block">
                        <select name="processMemo" lay-vertype="tips" lay-verify="required">
                            <option value="">请选择状态</option>
                            <option value="1">核价流程</option>
                            <option value="2">报价流程</option>
                            <option value="3">报销流程</option>
                            <option value="4">出差流程</option>
                            <option value="7">合同管理</option>
                        </select>
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label layui-form-required">权限节点: </label>
                    <div class="layui-input-block">
                        <select name="process" lay-vertype="tips" lay-verify="required">
                            <option value="">请选择状态</option>
                            <option value="1-1">1-1</option>
                            <option value="2-1">2-1</option>
                            <option value="3-1">3-1</option>
                            <option value="3-2">3-2</option>
                            <option value="4-1">4-1</option>
                            <option value="5-1">5-1</option>
                            <option value="6-1">6-1</option>
                            <option value="7-1">7-1</option>
                        </select>
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">备注: </label>
                    <div class="layui-input-block">