中扬CRM客户关系管理系统
#
LSH
2023-11-04 aa0161bf05195ccb00bc1d8da4b1b8218f93f4d3
#
14个文件已修改
2055 ■■■■ 已修改文件
src/main/java/com/zy/crm/common/model/SettleDto.java 73 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/controller/PlanController.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/controller/PriOnline2Controller.java 343 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/entity/PriOnline2.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/entity/ProcessPermissions.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/manager/utils/SmsUtils.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/CstmrMapper.xml 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/PriOnline2Mapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/priOnline2/priOnline.js 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/priOnline2/priOnline.html 297 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/priOnline2/priOnline_check.html 473 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/priOnline2/priOnline_detail.html 640 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/priOnline2/priOnline_more.html 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/processPermissions/processPermissions.html 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/common/model/SettleDto.java
@@ -30,7 +30,27 @@
    private Boolean curr;
    public static List<SettleDto> init(Plan plan, User manager,User planLeader) {
    public static List<SettleDto> InItFlowPath(List<User> users, List<String> names, int nodes) {
        List<SettleDto> list = new ArrayList<>();
        for (int i = 0; i < nodes; i++) {
            SettleDto dto = new SettleDto();
            dto.setStep(i);
            if (i == 0) {
                dto.setTitle("开始");
                dto.setMsg(users.get(i).getUsername() + names.get(i));
                dto.setTime(DateUtils.convert(new Date()));
                dto.setCurr(Boolean.TRUE);
            } else {
                dto.setTitle(names.get(i));
            }
            dto.setUserId(users.get(i).getId());
            dto.setUsername(users.get(i).getUsername());
            list.add(dto);
        }
        return list;
    }
    public static List<SettleDto> init(Plan plan, User manager, User planLeader) {
        List<SettleDto> list = new ArrayList<>();
        for (int i = 1; i < 6; i++) {
            SettleDto dto = new SettleDto();
@@ -45,12 +65,6 @@
                    dto.setCurr(Boolean.TRUE);
                    list.add(dto);
                    break;
//                case 2:
//                    dto.setTitle("组长审核");
//                    dto.setUserId(manager.getId());
//                    dto.setUsername(manager.getNickname());
//                    list.add(dto);
//                    break;
                case 2:
                    dto.setTitle("售前审核");
                    dto.setUserId(planLeader.getId());
@@ -74,7 +88,7 @@
        return list;
    }
    public static List<SettleDto> initPriQuote(Plan plan, User manager ,User president,User user) {
    public static List<SettleDto> initPriQuote(Plan plan, User manager, User president, User user) {
        List<SettleDto> list = new ArrayList<>();
        for (int i = 1; i < 5; i++) {
            SettleDto dto = new SettleDto();
@@ -101,10 +115,6 @@
                    dto.setUsername(president.getNickname());
                    list.add(dto);
                    break;
//                case 4:
//                    dto.setTitle("业务员审核");
//                    list.add(dto);
//                    break;
                case 4:
                    dto.setTitle("审批通过");
                    dto.setUserId(plan.getUserId());
@@ -118,21 +128,12 @@
        return list;
    }
    public static List<SettleDto> initPriQuote(ReimburseOnline reimburseOnline, User manager , User president3, User president4,User president5,User president6,User user) {
    public static List<SettleDto> initPriQuote(ReimburseOnline reimburseOnline, User manager, User president3, User president4, User president5, User president6, User user) {
        List<SettleDto> list = new ArrayList<>();
        for (int i = 0; i < 7; i++) {
            SettleDto dto = new SettleDto();
            dto.setStep(i);
            switch (i) {
//                case 0:
//                    dto.setTitle("开始");
//                    dto.setMsg(user.getUsername() + "创建了审批");
//                    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("开始");
                    dto.setMsg(user.getUsername() + "创建了审批");
@@ -149,33 +150,29 @@
                    list.add(dto);
                    break;
                case 3:
                    dto.setTitle(president3.getUsername()+"审核");
                    dto.setTitle(president3.getUsername() + "审核");
                    dto.setUserId(president3.getId());
                    dto.setUsername(president3.getNickname());
                    list.add(dto);
                    break;
                case 4:
                    dto.setTitle(president4.getUsername()+"审核");
                    dto.setTitle(president4.getUsername() + "审核");
                    dto.setUserId(president4.getId());
                    dto.setUsername(president4.getNickname());
                    list.add(dto);
                    break;
                case 5:
                    dto.setTitle(president5.getUsername()+"审核");
                    dto.setTitle(president5.getUsername() + "审核");
                    dto.setUserId(president5.getId());
                    dto.setUsername(president5.getNickname());
                    list.add(dto);
                    break;
                case 6:
                    dto.setTitle(president6.getUsername()+"审核");
                    dto.setTitle(president6.getUsername() + "审核");
                    dto.setUserId(president6.getId());
                    dto.setUsername(president6.getNickname());
                    list.add(dto);
                    break;
//                case 4:
//                    dto.setTitle("业务员审核");
//                    list.add(dto);
//                    break;
                default:
                    break;
            }
@@ -183,7 +180,7 @@
        return list;
    }
    public static List<SettleDto> initBusiness(User manager ,User user) {
    public static List<SettleDto> initBusiness(User manager, User user) {
        List<SettleDto> list = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            SettleDto dto = new SettleDto();
@@ -193,7 +190,7 @@
                    dto.setTitle("提交出差");
                    dto.setUserId(user.getId());
                    dto.setUsername(user.getNickname());
                    dto.setMsg(user.getNickname()+"提交出差申请");
                    dto.setMsg(user.getNickname() + "提交出差申请");
                    dto.setTime(DateUtils.convert(new Date()));
                    list.add(dto);
                    break;
@@ -210,9 +207,9 @@
        return list;
    }
    public static List<SettleDto> initSalesPricing(User manager ,User user,User userUp,List<String> names ,int nodes) {
    public static List<SettleDto> initSalesPricing(User manager, User user, User userUp, List<String> names, int nodes) {
        List<SettleDto> list = new ArrayList<>();
        for (int i = 0; i < nodes+1; i++) {
        for (int i = 0; i < nodes + 1; i++) {
            SettleDto dto = new SettleDto();
            dto.setStep(i);
            switch (i) {
@@ -250,9 +247,9 @@
        return list;
    }
    public static List<SettleDto> initSalesPricingPriOnline2(User user,User userUp,List<String> names ,int nodes) {
    public static List<SettleDto> initSalesPricingPriOnline2(User user, User userUp, List<String> names, int nodes) {
        List<SettleDto> list = new ArrayList<>();
        for (int i = 0; i < nodes+1; i++) {
        for (int i = 0; i < nodes + 1; i++) {
            SettleDto dto = new SettleDto();
            dto.setStep(i);
            switch (i) {
@@ -284,9 +281,9 @@
        return list;
    }
    public static List<SettleDto> initContract(User manager ,User user,User president,List<String> names ,int nodes) {
    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++) {
        for (int i = 0; i < nodes + 1; i++) {
            SettleDto dto = new SettleDto();
            dto.setStep(i);
            switch (i) {
src/main/java/com/zy/crm/manager/controller/PlanController.java
@@ -59,6 +59,7 @@
    private ProcessPermissionsService processPermissionsService;
    String PZH=" ————————————————— ";
    Integer PBN = 6;
    @GetMapping(value = "/plan/{id}/auth")
@@ -696,30 +697,20 @@
        wrapper.like("name", condition);
        wrapper.eq("status",1);
        ProcessPermissions processPermissions1 = processPermissionsService.selectOne(new EntityWrapper<ProcessPermissions>().eq("process_memo", 5).eq("process", "1-1"));//2:核价流程
        User manager1 = userService.selectById(processPermissions1.getUserId());       // 获取核价流程节点1确认人
        ProcessPermissions processPermissions2 = processPermissionsService.selectOne(new EntityWrapper<ProcessPermissions>().eq("process_memo", 5).eq("process", "1-2"));//2:核价流程
        User manager2 = userService.selectById(processPermissions2.getUserId());       // 获取核价流程节点1确认人
        ProcessPermissions processPermissions3= processPermissionsService.selectOne(new EntityWrapper<ProcessPermissions>().eq("process_memo", 5).eq("process", "1-3"));//2:核价流程
        User manager3 = userService.selectById(processPermissions3.getUserId());       // 获取核价流程节点1确认人
        List<ProcessPermissions> processPermissionsList = processPermissionsService.selectList(new EntityWrapper<ProcessPermissions>().eq("process_memo", 4).or().eq("process_memo", 5));//2:核价流程
        int type =0;
        if (getUserId().equals(manager1.getId())){
            type=1;//(货架)
        }else if (getUserId().equals(manager2.getId()) || getUserId().equals(manager3.getId())){
            type = 2;//(集成)
        }else {
        for (ProcessPermissions processPermissions:processPermissionsList){
            if (getUserId().equals(processPermissions.getUserId())){
                type=PBN-processPermissions.getProcessMemo();
                break;
            }
        }
        if (type==0){
            return R.error("你不是核价员,无权接任务");
        }
        List<Long> typeList = new ArrayList<>();
        List<PlanType> planTypes = planTypeService.selectList(new EntityWrapper<PlanType>().eq("type", type));
        if (type==1){
            planTypes = planTypeService.selectList(new EntityWrapper<PlanType>());
        }
        if (Cools.isEmpty(planTypes) || planTypes.size()==0){
            return R.ok();
        }
src/main/java/com/zy/crm/manager/controller/PriOnline2Controller.java
@@ -42,7 +42,7 @@
    private PlanService planService;
    @Autowired
    private  PlanTypeService planTypeService;
    private PlanTypeService planTypeService;
    @Autowired
    private ProcessPermissionsService processPermissionsService;
@@ -56,7 +56,7 @@
    @Autowired
    private UserService userService;
    String PZH=" ———————————————————————————————————————————————————————————————————————————————— ";
    String PZH = " ———————————————————————————————————————————————————————————————————————————————— ";
    @RequestMapping(value = "/priOnline2/{id}/auth")
    @ManagerAuth
@@ -65,7 +65,7 @@
        assert priOnline2 != null;
        JSONObject resultObj = JSON.parseObject(JSON.toJSONString(priOnline2));
        // 步骤条相关
        resultObj.put("step", priOnline2.getSettle() == 3 ? 0 : priOnline2.getSettle() + 1);
        resultObj.put("step", priOnline2.getSettle().equals(priOnline2.getSettleSize()) ? 0 : priOnline2.getSettle() + 1);
        return R.ok().add(resultObj);
    }
@@ -81,69 +81,71 @@
    @RequestMapping(value = "/priOnline2/list/auth")
    @ManagerAuth
    public R list(@RequestParam(defaultValue = "1")Integer curr,
                  @RequestParam(defaultValue = "10")Integer limit,
                  @RequestParam(required = false)String orderByField,
                  @RequestParam(required = false)String orderByType,
                  @RequestParam(required = false)String condition,
                  @RequestParam Map<String, Object> param){
    public R list(@RequestParam(defaultValue = "1") Integer curr,
                  @RequestParam(defaultValue = "10") Integer limit,
                  @RequestParam(required = false) String orderByField,
                  @RequestParam(required = false) String orderByType,
                  @RequestParam(required = false) String condition,
                  @RequestParam Map<String, Object> param) {
        EntityWrapper<PriOnline2> wrapper = new EntityWrapper<>();
        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.setSqlSelect("id,title,create_time as createTime,filepath,settle,settle_size as settleSize,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);
        allLike(PriOnline2.class, param.keySet(), wrapper, condition);
        wrapper.or().eq("member_id",getUserId());
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
        wrapper.or().eq("member_id", getUserId());
        if (!Cools.isEmpty(orderByField)) {
            wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));
        }
        return R.ok(priOnline2Service.selectPage(new Page<>(curr, limit), wrapper));
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
    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")){
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            if (entry.getKey().equals("dept_id")) {
                signDeptId = true;
                if (String.valueOf(entry.getValue()).equals("19")){
                if (String.valueOf(entry.getValue()).equals("19")) {
                    signHostId = true;
                }
            }
        }
        for (Map.Entry<String, Object> entry : map.entrySet()){
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            String val = String.valueOf(entry.getValue());
            if (val.contains(RANGE_TIME_LINK)){
            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")){
            } else if (entry.getKey().equals("dept_id")) {
                if (!val.equals("19")) {
                    wrapper.eq(entry.getKey(), val);
                }
            } else if (entry.getKey().equals("user_id") && !signDeptId){
            } else if (entry.getKey().equals("user_id") && !signDeptId) {
                signUserId = true;
                wrapper.eq(entry.getKey(), val);
            } else {
                wrapper.like(entry.getKey(), val);
            }
        }
        if (!signUserId && !signDeptId){
            if (getRole().getId()==1){
                wrapper.or().eq("host_id",1);
            }else if (getRole().getId()==2){
                wrapper.eq("dept_id",getDeptId());
            }else {
        if (!signUserId && !signDeptId) {
            if (getRole().getId() == 1) {
                wrapper.or().eq("host_id", 1);
            } else if (getRole().getId() == 2) {
                wrapper.eq("dept_id", getDeptId());
            } else {
                wrapper.eq("user_id", getUserId());
            }
        }
        if (signHostId){
            wrapper.or().eq("host_id",1);
        if (signHostId) {
            wrapper.or().eq("host_id", 1);
        }
    }
    @RequestMapping(value = "/priOnline2/add/auth")
    @ManagerAuth(memo = "添加核价管理")
    public R add(@RequestBody Map<String,Object> map) {
    public R add(@RequestBody Map<String, Object> map) {
        PriOnline2 priOnline2 = new PriOnline2();
        priOnline2.setCreateTime(new Date());
        priOnline2.setTitle(map.get("title").toString());
@@ -170,7 +172,7 @@
        //状态,未完成
        priOnline2.setStatus(0);
        if (plan.getStatus()!=1){
        if (plan.getStatus() != 1) {
            return R.error("此规划单状态改变,请刷新页面重新选择!");
        }
        priOnline2.setMemberId(getUserId());
@@ -188,18 +190,29 @@
//        }
//        String node="2-";
//        PlanType planType = planTypeService.selectById(plan.getPlanType());
        PlanType planType = planTypeService.selectById(plan.getPlanType());
//        node = node+planType.getType();
//        ProcessPermissions processPermissions = processPermissionsService.selectOne(new EntityWrapper<ProcessPermissions>().eq("process_memo", 5).eq("process", node));//2:核价流程
//        ProcessPermissions processPermissions = processPermissionsService.selectOne(new EntityWrapper<ProcessPermissions>().eq("process_memo", 5).eq("process", "2-1"));//2:核价流程
//        User manager = userService.selectById(processPermissions.getUserId());       // 获取核价流程节点2确认人
                                // 获取业务员
        // 获取业务员
        List<String> initNames = new ArrayList<>();
        initNames.add("接取核价任务");
        initNames.add("完成核价");
        if (planType.getType().equals(2)) {
            initNames.add("完成核价");
        }
//        initNames.add("经理审核");
        initNames.add("业务员确认");
        priOnline2.setSettleMsg(JSON.toJSONString(SettleDto.initSalesPricingPriOnline2(getUser(),userUp,initNames,2)));
        List<User> users = new ArrayList<>();
        users.add(getUser());
        users.add(getUser());
        if (planType.getType().equals(2)) {
            users.add(userService.selectById(73));
        }
        users.add(userUp);
        priOnline2.setSettleMsg(JSON.toJSONString(SettleDto.InItFlowPath(users, initNames, users.size())));
        priOnline2.setSettleSize(users.size());
        //设置项目流程
        plan.setStep(2);
@@ -212,7 +225,7 @@
    @RequestMapping(value = "/priOnline2/addOther/auth")
    @ManagerAuth(memo = "另存核价管理")
    public R addOther(@RequestBody Map<String,Object> map) {
    public R addOther(@RequestBody Map<String, Object> map) {
        PriOnline2 online = priOnline2Service.selectById(Long.parseLong(map.get("id").toString()));
        PriOnline2 priOnline2 = new PriOnline2();
@@ -242,9 +255,9 @@
        return R.ok();
    }
    @RequestMapping(value = "/priOnline2/update/auth")
    @ManagerAuth(memo = "更新核价管理")
    public R update(@RequestBody Map<String,Object> map){
    @RequestMapping(value = "/priOnline2/update/auth")
    @ManagerAuth(memo = "更新核价管理")
    public R update(@RequestBody Map<String, Object> map) {
        PriOnline2 priOnline2 = priOnline2Service.selectById(Long.parseLong(map.get("id").toString()));
        if (priOnline2.getStatus() == 1) {
            return R.error("核价已完成,禁止保存");
@@ -262,7 +275,7 @@
    //更新状态
    @RequestMapping(value = "/priOnline2/updateForm/auth")
    @ManagerAuth(memo = "更新核价管理状态")
    public R updateForm(Long id,Integer status,String title,String templateName){
    public R updateForm(Long id, Integer status, String title, String templateName) {
        PriOnline2 priOnline2 = priOnline2Service.selectById(id);
        priOnline2.setStatus(status);
        priOnline2.setUpdateTime(new Date());
@@ -276,7 +289,7 @@
    @ManagerAuth(memo = "上传询价文件")
    public R uploadCheck(@RequestParam("id") Integer id,
                         @RequestParam("checkData") String checkData,
                         @RequestParam("file") MultipartFile[] files){
                         @RequestParam("file") MultipartFile[] files) {
        PriOnline2 priOnline2 = priOnline2Service.selectById(id);
        if (priOnline2.getStatus() == 1) {
            return R.error("核价已完成,禁止上传");
@@ -286,7 +299,7 @@
        MultipartFile file = files[0];
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd_HHmmss");
        String path =  ClassUtils.getDefaultClassLoader().getResource("excel/uploadCheckData").getPath();
        String path = ClassUtils.getDefaultClassLoader().getResource("excel/uploadCheckData").getPath();
        //文件后缀名
        String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        //上传文件名
@@ -297,7 +310,7 @@
        //服务器端保存的文件对象
        File serverFile = new File(filepath);
        if(!serverFile.exists()) {
        if (!serverFile.exists()) {
            try {
                //创建文件
                serverFile.createNewFile();
@@ -343,14 +356,14 @@
    @RequestMapping(value = "/priOnline2/delete/auth")
    @ManagerAuth(memo = "删除核价管理")
    public R delete(Long[] ids){
        try{
            if (Cools.isEmpty(ids) || ids.length==0){
    public R delete(Long[] ids) {
        try {
            if (Cools.isEmpty(ids) || ids.length == 0) {
                return R.error();
            }
            for (Long id : ids){
                int  priQuote= priQuoteService.selectCount(new EntityWrapper<PriQuote>().eq("pri_online_id", id));
                if (priQuote!=0){
            for (Long id : ids) {
                int priQuote = priQuoteService.selectCount(new EntityWrapper<PriQuote>().eq("pri_online_id", id));
                if (priQuote != 0) {
                    return R.error("存在关联的报价单,禁止删除!!!");
                }
//                int priSales = priSalesService.selectCount(new EntityWrapper<PriSales>().eq("pri_online2_id", id));
@@ -367,14 +380,14 @@
            priOnline2Service.deleteBatchIds(Arrays.asList(ids));
            return R.ok();
        }catch (Exception e){
        } catch (Exception e) {
            return R.error(e.getMessage());
        }
    }
    @RequestMapping(value = "/priOnline2/export/auth")
    @ManagerAuth
    public R export(@RequestBody JSONObject param){
    public R export(@RequestBody JSONObject param) {
        EntityWrapper<PriOnline2> wrapper = new EntityWrapper<>();
        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
        Map<String, Object> map = excludeTrash(param.getJSONObject("priOnline"));
@@ -391,7 +404,7 @@
        wrapper.in("user_id", getUserRoleBelongsToUserId("allopen"));
        Page<PriOnline2> page = priOnline2Service.selectPage(new Page<>(0, 10), wrapper);
        List<Map<String, Object>> result = new ArrayList<>();
        for (PriOnline2 priOnline2 : page.getRecords()){
        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$());
@@ -409,7 +422,7 @@
        wrapper.in("user_id", getUserRoleBelongsToUserId("allopen"));
        Page<PriOnline2> page = priOnline2Service.selectPage(new Page<>(0, 10), wrapper);
        List<Map<String, Object>> result = new ArrayList<>();
        for (PriOnline2 priOnline2 : page.getRecords()){
        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$());
@@ -425,7 +438,7 @@
    @ManagerAuth
    public R query(@RequestBody JSONObject param) {
        Wrapper<PriOnline2> wrapper = new EntityWrapper<PriOnline2>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
        if (null != priOnline2Service.selectOne(wrapper)){
        if (null != priOnline2Service.selectOne(wrapper)) {
            return R.parse(BaseRes.REPEAT).add(getComment(PriOnline2.class, String.valueOf(param.get("key"))));
        }
        return R.ok();
@@ -448,26 +461,26 @@
        Date now = new Date();
        Long memberId = priOnline2.getMemberId();
        User member = userService.selectById(memberId);
        if (!member.getId().equals(getUserId())){
        if (!member.getId().equals(getUserId())) {
            return R.error("抱歉,您没有审核的权限");
        }
        List<SettleDto> planDtos = JSON.parseArray(priOnline2.getSettleMsg(), SettleDto.class);
        List<SettleDto> planDtoList = new ArrayList<>();
        boolean sign = true;
        for (SettleDto dto : planDtos) {
            if (dto.getStep().equals(1)){
            if (dto.getStep().equals(1)) {
                priOnline2.setMemberId(dto.getUserId());
            }
            if (sign && dto.getUserId().equals(memberId) && priOnline2.getSettle()+1==dto.getStep()){
                if (Cools.isEmpty(dto.getMsg())){
                    dto.setMsg(DateUtils.convert(now)+" "+member.getNickname()+"回退审批");
                }else {
                    dto.setMsg(dto.getMsg()+PZH+DateUtils.convert(now)+" "+member.getNickname()+"回退审批");
            if (sign && dto.getUserId().equals(memberId) && priOnline2.getSettle() + 1 == dto.getStep()) {
                if (Cools.isEmpty(dto.getMsg())) {
                    dto.setMsg(DateUtils.convert(now) + " " + member.getNickname() + "回退审批");
                } else {
                    dto.setMsg(dto.getMsg() + PZH + DateUtils.convert(now) + " " + member.getNickname() + "回退审批");
                }
                sign = false;
            }
            if (sign){
                dto.setMsg(dto.getMsg()+PZH+DateUtils.convert(now)+" "+member.getNickname()+"回退审批");
            if (sign) {
                dto.setMsg(dto.getMsg() + PZH + DateUtils.convert(now) + " " + member.getNickname() + "回退审批");
            }
            planDtoList.add(dto);
@@ -485,161 +498,69 @@
    @PostMapping(value = "/priOnline2/approval/auth")
    @ManagerAuth
    public R approvalBusinessTrip(@RequestParam Long priOnlineId,
                                  @RequestParam(required = false) Long plannerId){
                                  @RequestParam(required = false) Long plannerId) {
        PriOnline2 priOnline2 = priOnline2Service.selectById(priOnlineId);
        assert priOnline2 != null;
        Date now = new Date();
        switch (priOnline2.getSettle()) {
            case 0:
                // 本部门经理审核  节点负责人
                User user = userService.selectById(priOnline2.getMemberId());
        Long nextUserId = getUserId();
        User user = new User();
        List<SettleDto> list = new ArrayList<>();
                Plan plan1 = planService.selectById(priOnline2.getItemId());
//                PlanType planType1 = planTypeService.selectById(plan1.getPlanType());
//
//                ProcessPermissions processPermissions1 = processPermissionsService.selectOne(new EntityWrapper<ProcessPermissions>().eq("process_memo", 5).eq("process", "2-"+planType1.getType()));//2:核价流程
//                User manager1 = userService.selectById(processPermissions1.getUserId());       // 获取报价流程节点2确认人
        user = userService.selectById(priOnline2.getMemberId());
                if (Cools.isEmpty(getUser())) {
                    return R.error("抱歉,您没有提交的权限");
                }
                if (!getUserId().equals(user.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);
                            if (Cools.isEmpty(dto.getMsg())){
                                dto.setMsg(user.getNickname() + "提交完成");
                            }else {
                                dto.setMsg(dto.getMsg()+PZH+DateUtils.convert(new Date())+" " + user.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(plan1.getUserId());
                if (!priOnline2Service.updateById(priOnline2)) {
                    throw new CoolException("提交失败,请联系管理员");
                }
                break;
//            case 1:
//                // 本部门经理审核  节点负责人
//                Plan plan = planService.selectById(priOnline2.getItemId());
//                PlanType planType = planTypeService.selectById(plan.getPlanType());
//
//                ProcessPermissions processPermissions = processPermissionsService.selectOne(new EntityWrapper<ProcessPermissions>().eq("process_memo", 5).eq("process", "2-"+planType.getType()));//2:报价流程
//                User manager = userService.selectById(processPermissions.getUserId());       // 获取报价流程节点2确认人
//
////                User manager = new User();
////                try{
////                    manager = userService.getDeptManager(getHostId(), getUser().getDeptId());        // 获取部门领导
////                }catch (Exception e){
////                    manager = user;
////                }
//                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);
//                                if (Cools.isEmpty(dto.getMsg())){
//                                    dto.setMsg(manager.getNickname() + "审批通过");
//                                }else {
//                                    dto.setMsg(dto.getMsg()+PZH+DateUtils.convert(new Date())+" " + manager.getNickname() + "审批通过");
//                                }
//                                dto.setTime(DateUtils.convert(now));
//                                break;
//                            default:
//                                break;
//                        }
//                    }
//                    priOnline2.setSettleMsg(JSON.toJSONString(list));
//
//                    // 修改规划单状态
//                    priOnline2.setSettle(2);  // 申请通过
//                    priOnline2.setUpdateTime(now);
//                    priOnline2.setUpdateUserId(getUserId());
//                    priOnline2.setMemberId(plan.getUserId());
//                    if (!priOnline2Service.updateById(priOnline2)) {
//                        throw new CoolException("审核失败,请联系管理员");
//                    }
//                } else {
//                    return R.error("抱歉,您没有审核的权限!!!");
//                }
//                break;
            case 1:
                // 业务员
                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 1:
                            dto.setCurr(Boolean.TRUE);
                            break;
                        case 2:
                            dto.setCurr(Boolean.TRUE);
                            if (Cools.isEmpty(dto.getMsg())){
                                dto.setMsg("业务员" + salesman0.getNickname() + "审批通过");
                            }else {
                                dto.setMsg(dto.getMsg()+PZH+DateUtils.convert(new Date())+" "+"业务员" + salesman0.getNickname() + "审批通过");
                            }
                            dto.setTime(DateUtils.convert(new Date()));
                            break;
                        default:
                            break;
                    }
                }
                priOnline2.setSettleMsg(JSON.toJSONString(list2));
                // 修改规划单状态
                priOnline2.setSettle(2);  // 审批通过
                priOnline2.setStatus(1);
                priOnline2.setUpdateTime(new Date());
                priOnline2.setUpdateUserId(getUserId());
                if (!priOnline2Service.updateById(priOnline2)) {
                    throw new CoolException("确认失败,请联系管理员");
                }
                try{
                    priQuoteAdd(priOnline2.getId(),plannerId);
                }catch (Exception e){
                    return R.error("自动生成报价单失败");
                }
                break;
            default:
                return R.error();
        if (Cools.isEmpty(getUser()) || Cools.isEmpty(user)){
            return R.error("抱歉,您无需确认!!!");
        }
        if (!getUserId().equals(user.getId())) {
            return R.error("抱歉,您无需确认!!!");
        }
        // 修改 settle 步骤数据
        list = JSON.parseArray(priOnline2.getSettleMsg(), SettleDto.class);
        for (SettleDto dto : list) {
            if (dto.getStep().equals(priOnline2.getSettle())) {
                dto.setCurr(Boolean.TRUE);
            } else if (dto.getStep().equals(priOnline2.getSettle() + 1)) {
                dto.setCurr(Boolean.TRUE);
                if (Cools.isEmpty(dto.getMsg())) {
                    dto.setMsg(user.getNickname() + "审批通过");
                } else {
                    dto.setMsg(dto.getMsg() + PZH + DateUtils.convert(new Date()) + " " + user.getNickname() + "审批通过");
                }
                dto.setTime(DateUtils.convert(new Date()));
            } else if (dto.getStep().equals(priOnline2.getSettle() + 2)) {
                nextUserId=dto.getUserId();
            }
        }
        priOnline2.setSettleMsg(JSON.toJSONString(list));
        // 修改规划单状态
        priOnline2.setSettle(priOnline2.getSettle() + 1);  // 审批通过
        if (user.getId().equals(priOnline2.getUserId())) {
            priOnline2.setStatus(1);
        }
        priOnline2.setUpdateTime(now);
        priOnline2.setUpdateUserId(getUserId());
        priOnline2.setMemberId(nextUserId);
        if (!priOnline2Service.updateById(priOnline2)) {
            throw new CoolException("确认失败,请联系管理员");
        }
        if (user.getId().equals(priOnline2.getUserId())) {
            try {
                priQuoteAdd(priOnline2.getId(), plannerId);
            } catch (Exception e) {
                return R.error("自动生成报价单失败");
            }
        }
        return R.ok("审批成功");
    }
    public void priQuoteAdd(Long priOnlineId,Long priType){
    public void priQuoteAdd(Long priOnlineId, Long priType) {
        Pri pri = null;
        if (priType==1L){
        if (priType == 1L) {
            pri = priService.selectById(114);
        }else {
        } else {
            pri = priService.selectById(115);
        }
@@ -676,16 +597,16 @@
//        priQuote.setForm(JSON.toJSONString(map));     // 自定义表单内容
        priQuote.setSettle(1);  // 1.开始
        User manager = new User();
        try{
        try {
            manager = userService.getDeptManager(getHostId(), getUser().getDeptId());        // 获取部门领导
        }catch (Exception e){
        } catch (Exception e) {
            manager = getUser();
        }
        priQuote.setMemberId(manager.getId());
        ProcessPermissions processPermissions = processPermissionsService.selectOne(new EntityWrapper<ProcessPermissions>().eq("process_memo", 2).eq("process", "3-1"));//2:报价流程
        User president = userService.selectById(processPermissions.getUserId());       // 获取报价流程节点3-1确认人
        priQuote.setSettleMsg(JSON.toJSONString(SettleDto.initPriQuote(plan, manager,president,getUser())));
        priQuote.setSettleMsg(JSON.toJSONString(SettleDto.initPriQuote(plan, manager, president, getUser())));
        planService.updateById(plan);
@@ -694,7 +615,7 @@
    @PostMapping(value = "/priOnline2/priQuoteAdd/list/auth")
    @ManagerAuth
    public R priOnline2priQuoteAdd(@RequestParam Long planId){
    public R priOnline2priQuoteAdd(@RequestParam Long planId) {
        List<KeyValueVo> vos = new ArrayList<>();
        vos.add(new KeyValueVo("报价模板1", 1L));
        vos.add(new KeyValueVo("报价模板2", 2L));
src/main/java/com/zy/crm/manager/entity/PriOnline2.java
@@ -134,6 +134,13 @@
    private Integer settle;
    /**
     * 进度
     */
    @ApiModelProperty(value= "进度")
    @TableField("settle_size")
    private Integer settleSize;
    /**
     * 流程进度
     */
    @ApiModelProperty(value= "流程进度")
@@ -145,12 +152,13 @@
    public PriOnline2() {}
    public PriOnline2(String title, String sheetData, Date createTime, String filepath,Integer settle) {
    public PriOnline2(String title, String sheetData, Date createTime, String filepath,Integer settle,Integer settleSize) {
        this.title = title;
        this.sheetData = sheetData;
        this.createTime = createTime;
        this.filepath = filepath;
        this.settle = settle;
        this.settleSize = settleSize;
    }
//    PriOnline priOnline = new PriOnline(
@@ -167,6 +175,8 @@
            case 1:
                return "等待确认";
            case 2:
                return this.settleSize.equals(this.settle+1)? "审批通过" : "等待确认";
            case 3:
                return "审批通过";
            default:
                return String.valueOf(this.settle);
src/main/java/com/zy/crm/manager/entity/ProcessPermissions.java
@@ -126,15 +126,15 @@
        if (null == this.processMemo){ return null; }
        switch (this.processMemo){
            case 1:
                return "核价流程";
                return "规划流程";
            case 2:
                return "报价流程";
            case 3:
                return "报销流程";
            case 4:
                return "出差流程";
                return "集成核价流程";
            case 5:
                return "核价流程";
                return "货架核价流程";
            case 7:
                return "合同管理";
            case 101:
src/main/java/com/zy/crm/manager/utils/SmsUtils.java
@@ -64,7 +64,7 @@
            headers.put("Authorization", "APPCODE " + APPCODE);
            param.put("templateId", "M6F3C81FE3");
            param.put("receive", phone);
            param.put("receive", "13083813523");
            param.put("tag", code);
            String response = new HttpHandler.Builder()
src/main/resources/mapper/CstmrMapper.xml
@@ -104,12 +104,9 @@
                and
                (
                    <if test="userId != null and userId != ''">
                        user_id = #{userId}
                        user_id = #{userId} or
                    </if>
                    <if test="userId == null or userId == ''">
                        user_id is not null
                    </if>
                    or
                    director = #{userId} or
                    mc.id in
                    (
                        select
@@ -640,59 +637,49 @@
        LEFT JOIN sys_dept sd ON mc.dept_id = sd.id
        WHERE 1=1
        and director is null
        <choose>
            <when test="deptId != null and deptId != ''">
                AND ((CHARINDEX(','+#{deptId}+',', ','+sd.path+',') > 0 OR sd.id = #{deptId})
                or
                (
                user_id = #{userId}
                or
                mc.id in
                (
                select
                cstmr_id
                from man_cstmr_foll
                where 1=1
                and user_id = #{userId}
                )
                ))
            </when>
            <otherwise>
                and
                (
                <if test="userId != null and userId != ''">
                    user_id = #{userId}
                </if>
                <if test="userId == null or userId == ''">
                    user_id is not null
                </if>
                or
                mc.id in
                (
                select
                cstmr_id
                from man_cstmr_foll
                where 1=1
                and user_id = #{userId}
                )
                )
            </otherwise>
        </choose>
<!--        <choose>-->
<!--            <when test="deptId != null and deptId != ''">-->
<!--                AND ((CHARINDEX(','+#{deptId}+',', ','+sd.path+',') > 0 OR sd.id = #{deptId})-->
<!--                or-->
<!--                (-->
<!--                user_id = #{userId}-->
<!--                or-->
<!--                mc.id in-->
<!--                (-->
<!--                select-->
<!--                cstmr_id-->
<!--                from man_cstmr_foll-->
<!--                where 1=1-->
<!--                and user_id = #{userId}-->
<!--                )-->
<!--                ))-->
<!--            </when>-->
<!--            <otherwise>-->
<!--                and-->
<!--                (-->
<!--                <if test="userId != null and userId != ''">-->
<!--                    user_id = #{userId}-->
<!--                </if>-->
<!--                <if test="userId == null or userId == ''">-->
<!--                    user_id is not null-->
<!--                </if>-->
<!--                or-->
<!--                mc.id in-->
<!--                (-->
<!--                select-->
<!--                cstmr_id-->
<!--                from man_cstmr_foll-->
<!--                where 1=1-->
<!--                and user_id = #{userId}-->
<!--                )-->
<!--                )-->
<!--            </otherwise>-->
<!--        </choose>-->
        <if test="hostId != null">
            and mc.host_id = #{hostId}
        </if>
        <if test="condition != null and condition != ''">
            and (
            mc.uuid like concat('%',#{condition},'%')
            or mc.name like concat('%',#{condition},'%')
            or mc.simple like concat('%',#{condition},'%')
            or mc.rela like concat('%',#{condition},'%')
            or mc.tel like concat('%',#{condition},'%')
            or mc.contacts like concat('%',#{condition},'%')
            or mc.remarks like concat('%',#{condition},'%')
            or mc.director like concat('%',#{condition},'%')
            or mc.addr like concat('%',#{condition},'%')
            )
            and mc.name like concat('%',#{condition},'%')
        </if>
        ORDER BY mc.create_time DESC
    </select>
src/main/resources/mapper/PriOnline2Mapper.xml
@@ -18,6 +18,7 @@
        <result column="update_time" property="updateTime" />
        <result column="check_data" property="checkData" />
        <result column="settle" property="settle" />
        <result column="settle_size" property="settleSize" />
    </resultMap>
    <!-- 查询结果不包含excel数据data,以免结果集过大 -->
@@ -34,6 +35,7 @@
        <result column="status" property="status" />
        <result column="update_time" property="updateTime" />
        <result column="settle" property="settle" />
        <result column="settle_size" property="settleSize" />
    </resultMap>
    <select id="listByPage" resultMap="NoDataResultMap">
src/main/webapp/static/js/priOnline2/priOnline.js
@@ -5,7 +5,7 @@
    base: baseUrl + "/static/layui/lay/modules/"
}).extend({
    cascader: 'cascader/cascader',
}).use(['table','laydate', 'form', 'admin', 'xmSelect', 'element', 'cascader', 'tree', 'dropdown'], function() {
}).use(['table', 'laydate', 'form', 'admin', 'xmSelect', 'element', 'cascader', 'tree', 'dropdown'], function () {
    var table = layui.table;
    var $ = layui.jquery;
    var layer = layui.layer;
@@ -104,7 +104,7 @@
                hide: false
            }
            , {field: 'itemId', align: 'center', title: '规划单号', hide: true}
            , {field: 'status$', align: 'center', title: '状态',hide : false}
            , {field: 'status$', align: 'center', title: '状态', hide: false}
            // ,{field: 'memberId$', align: 'center',title: ''}
            , {
                field: 'settle$',
@@ -114,12 +114,13 @@
                event: 'more',
                hide: false
            }
            , {field: 'user$', align: 'center', title: '业务员',hide : false}
            , {field: 'deptId$', align: 'center', title: '部门',hide : true}
            , {field: 'checkDataStatus$', align: 'center', title: '报价数据',hide : false}
            , {field: 'createTime$', align: 'center', title: '创建时间',hide : true}
            , {field: 'updateUserId$', align: 'center', title: '更新人员',hide : false}
            , {field: 'updateTime$', align: 'center', title: '更新时间',hide : false}
            , {field: 'settleSize', align: 'center', title: '流程长度', hide: true}
            , {field: 'user$', align: 'center', title: '业务员', hide: false}
            , {field: 'deptId$', align: 'center', title: '部门', hide: true}
            , {field: 'checkDataStatus$', align: 'center', title: '报价数据', hide: false}
            , {field: 'createTime$', align: 'center', title: '创建时间', hide: true}
            , {field: 'updateUserId$', align: 'center', title: '更新人员', hide: false}
            , {field: 'updateTime$', align: 'center', title: '更新时间', hide: false}
            , {fixed: 'right', title: '操作', align: 'center', toolbar: '#operate', width: 350}
        ]],
        request: {
@@ -267,6 +268,7 @@
                    title: data.name
                }, function (i) {
                    layer.close(i);
                    console.log(data)
                    approvalEnd(data.id);
                });
                break;
@@ -277,13 +279,14 @@
                    offset: '200px',
                    title: data.name
                }, function (i) {
                    console.log(data)
                    layer.close(i);
                    // 指定规划员
                    if (data.settle === 1) {
                    // 指定模板
                    if ((data.settle === 1 && data.settleSize===3) || (data.settle===2 && data.settleSize===4)) {
                        admin.open({
                            type: 1,
                            area: '300px',
                            title: '选择规划员',
                            title: '选择报价模板',
                            content: $('#plannerListDialog').html(),
                            success: function (layero, dIndex) {
                                let plannerSel = xmSelect.render({
@@ -582,10 +585,11 @@
            }
        });
    }
    function approvalEnd(planId, plannerId, dIdx) {
    function approvalEnd(priOnlineId, plannerId, dIdx) {
        let loadIndex = layer.load(2);
        $.ajax({
            url: baseUrl+"/priOnline2/approvalEnd/auth",
            url: baseUrl + "/priOnline2/approvalEnd/auth",
            headers: {'token': localStorage.getItem('token')},
            data: {
                priOnlineId: priOnlineId,
@@ -597,11 +601,11 @@
                    layer.close(dIdx);
                }
                layer.close(loadIndex);
                if (res.code === 200){
                if (res.code === 200) {
                    layer.msg(res.msg, {icon: 1});
                    tableReload();
                } else if (res.code === 403){
                    top.location.href = baseUrl+"/";
                } else if (res.code === 403) {
                    top.location.href = baseUrl + "/";
                } else {
                    layer.msg(res.msg, {icon: 2});
                }
@@ -612,7 +616,7 @@
    function approval(priOnlineId, plannerId, dIdx) {
        let loadIndex = layer.load(2);
        $.ajax({
            url: baseUrl+"/priOnline2/approval/auth",
            url: baseUrl + "/priOnline2/approval/auth",
            headers: {'token': localStorage.getItem('token')},
            data: {
                priOnlineId: priOnlineId,
@@ -624,11 +628,11 @@
                    layer.close(dIdx);
                }
                layer.close(loadIndex);
                if (res.code === 200){
                if (res.code === 200) {
                    layer.msg(res.msg, {icon: 1});
                    tableReload();
                } else if (res.code === 403){
                    top.location.href = baseUrl+"/";
                } else if (res.code === 403) {
                    top.location.href = baseUrl + "/";
                } else {
                    layer.msg(res.msg, {icon: 2});
                }
@@ -639,13 +643,13 @@
});
// 关闭动作
$(document).on('click','#data-detail-close', function () {
$(document).on('click', '#data-detail-close', function () {
    parent.layer.closeAll();
});
function tableReload(child) {
    var searchData = {};
    $.each($('#search-box [name]').serializeArray(), function() {
    $.each($('#search-box [name]').serializeArray(), function () {
        searchData[this.name] = this.value;
    });
    (child ? parent.tableIns : tableIns).reload({
@@ -655,14 +659,14 @@
        },
        done: function (res, curr, count) {
            if (res.code === 403) {
                top.location.href = baseUrl+"/";
                top.location.href = baseUrl + "/";
            }
            pageCurr=curr;
            pageCurr = curr;
            if (res.data.length === 0 && count !== 0) {
                tableIns.reload({
                    where: searchData,
                    page: {
                        curr: pageCurr-1
                        curr: pageCurr - 1
                    }
                });
                pageCurr -= 1;
@@ -676,9 +680,9 @@
    for (var val in data) {
        var find = el.find(":input[id='" + val + "']");
        find.val(data[val]);
        if (showImg){
        if (showImg) {
            var next = find.next();
            if (next.get(0)){
            if (next.get(0)) {
                if (next.get(0).localName === "img") {
                    find.hide();
                    next.attr("src", data[val]);
@@ -698,13 +702,13 @@
function detailScreen(index) {
    var detail = layer.getChildFrame('#data-detail', index);
    var height = detail.height()+60;
    if (height > ($(window).height()*0.9)) {
        height = ($(window).height()*0.9);
    var height = detail.height() + 60;
    if (height > ($(window).height() * 0.9)) {
        height = ($(window).height() * 0.9);
    }
    layer.style(index, {
        top: (($(window).height()-height)/3)+"px",
        height: height+'px'
        top: (($(window).height() - height) / 3) + "px",
        height: height + 'px'
    });
    $(".layui-layer-shade").remove();
}
src/main/webapp/views/priOnline2/priOnline.html
@@ -1,103 +1,107 @@
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title></title>
  <meta name="renderer" content="webkit">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
  <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
  <link rel="stylesheet" href="../../static/css/cool.css" media="all">
  <link rel="stylesheet" href="../../static/css/tree.css" media="all">
  <link rel="stylesheet" href="../../static/layui/lay/modules/formDesigner/coolForm.css" />
  <style>
    .nav-box {
      position: absolute;
      top: 1px;
      left: 5px;
    }
    .nav-box-item {
      display: inline-block;
      vertical-align: middle;
      margin-right: 5px;
    }
    <meta charset="utf-8">
    <title></title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
    <link rel="stylesheet" href="../../static/css/tree.css" media="all">
    <link rel="stylesheet" href="../../static/layui/lay/modules/formDesigner/coolForm.css"/>
    <style>
        .nav-box {
            position: absolute;
            top: 1px;
            left: 5px;
        }
  </style>
        .nav-box-item {
            display: inline-block;
            vertical-align: middle;
            margin-right: 5px;
        }
    </style>
</head>
<body>
<div class="layui-fluid">
  <div class="layui-card">
    <div class="layui-card-body">
      <div id="search-box" class="layui-form toolbar" style="display: flex;justify-content: flex-end;position: relative">
        <div class="nav-box">
          <div class="nav-box-item">
            <i class="layui-icon" style="color: #1890ff;font-weight: bold">&#xe613;</i>
          </div>
          <div class="nav-box-item">
            <button id="organization" style="border: none;padding-right: 35px;" class="layui-btn layui-btn-primary icon-btn">
              未知
            </button>
          </div>
        </div>
        <div class="layui-form-item">
          <div class="layui-inline">
            <div class="layui-input-inline">
              <input class="layui-input" type="text" name="condition" placeholder="请输入" autocomplete="off" style="border-color: #e1e1e1">
    <div class="layui-card">
        <div class="layui-card-body">
            <div id="search-box" class="layui-form toolbar"
                 style="display: flex;justify-content: flex-end;position: relative">
                <div class="nav-box">
                    <div class="nav-box-item">
                        <i class="layui-icon" style="color: #1890ff;font-weight: bold">&#xe613;</i>
                    </div>
                    <div class="nav-box-item">
                        <button id="organization" style="border: none;padding-right: 35px;"
                                class="layui-btn layui-btn-primary icon-btn">
                            未知
                        </button>
                    </div>
                </div>
                <div class="layui-form-item">
                    <div class="layui-inline">
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="condition" placeholder="请输入" autocomplete="off"
                                   style="border-color: #e1e1e1">
                        </div>
                    </div>
                    <div class="layui-inline">&emsp;
                        <button class="layui-btn icon-btn layui-btn-sm" lay-filter="search" lay-submit>
                            <i class="layui-icon">&#xe615;</i>搜索
                        </button>
                    </div>
                </div>
            </div>
          </div>
          <div class="layui-inline">&emsp;
            <button class="layui-btn icon-btn layui-btn-sm" lay-filter="search" lay-submit>
              <i class="layui-icon">&#xe615;</i>搜索
            </button>
          </div>
            <table class="layui-hide" id="priOnline" lay-filter="priOnline"></table>
        </div>
      </div>
      <table class="layui-hide" id="priOnline" lay-filter="priOnline"></table>
    </div>
  </div>
</div>
<script type="text/html" id="toolbar">
  <div class="layui-btn-container">
    <button class="layui-btn layui-btn-sm" lay-event="addBlank">新增核价</button>
    <button class="layui-btn layui-btn-sm layui-btn-danger" lay-event="deleteData">删除</button>
  </div>
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-sm" lay-event="addBlank">新增核价</button>
        <button class="layui-btn layui-btn-sm layui-btn-danger" lay-event="deleteData">删除</button>
    </div>
</script>
<form id="uploadFile" enctype="multipart/form-data" style="display: none;" >
  <input type="file" name="file" id="uploadQuote">
  <input type="button" onclick="upload()" value="上传"/>
<form id="uploadFile" enctype="multipart/form-data" style="display: none;">
    <input type="file" name="file" id="uploadQuote">
    <input type="button" onclick="upload()" value="上传"/>
</form>
<script type="text/html" id="operate">
  {{# if (d.settle == 0) { }}
    {{# if ((d.settle == 0) || (d.settle == 1 && d.settleSize == 4)){ }}
    <a class="layui-btn layui-btn-xs btn-edit" lay-event="approval">提交</a>
    <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a>
  {{# } }}
  {{# if (d.settle == 1) { }}
    {{# } }}
    {{# if ((d.settle == 1 && d.settleSize == 3) || (d.settle == 2 && d.settleSize == 4)){ }}
    <a class="layui-btn layui-btn-xs btn-edit" lay-event="approval">确认</a>
    <a class="layui-btn layui-btn-xs btn-edit" lay-event="approvalEnd">回退审批</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-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>
</script>
<script type="text/html" id="plannerListDialog">
  <div class="layui-form admin-form">
    <div class="model-form" style="padding: 30px">
      <div id="plannerXmlSel"></div>
    <div class="layui-form admin-form">
        <div class="model-form" style="padding: 30px">
            <div id="plannerXmlSel"></div>
        </div>
        <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 layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
        </div>
    </div>
    <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 layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
    </div>
  </div>
</script>
<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
@@ -111,86 +115,99 @@
<script type="text/javascript" src="../../static/js/priOnline2/priOnline.js" charset="utf-8"></script>
<!-- 表单弹窗 -->
<script type="text/html" id="editDialog">
  <div id="detail" lay-filter="detail" class="layui-form admin-form model-form">
    <input name="id" type="hidden">
    <div class="layui-row">
      <div class="layui-col-md12">
        <div class="layui-form-item">
          <label class="layui-form-label layui-form-required">项目名: </label>
          <div class="layui-input-block cool-auto-complete">
            <input class="layui-input" name="planId" placeholder="请输入项目名" style="display: none" lay-verify="required">
            <input id="planId$" name="planId$" 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="planQueryNameToRobBydirector" onkeyup="autoLoad(this.getAttribute('data-key'))">
              <select class="cool-auto-complete-window-select" data-key="planQueryNameToRobBydirectorSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
              </select>
    <div id="detail" lay-filter="detail" class="layui-form admin-form model-form">
        <input name="id" type="hidden">
        <div class="layui-row">
            <div class="layui-col-md12">
                <div class="layui-form-item">
                    <label class="layui-form-label layui-form-required">项目名: </label>
                    <div class="layui-input-block cool-auto-complete">
                        <input class="layui-input" name="planId" placeholder="请输入项目名" style="display: none"
                               lay-verify="required">
                        <input id="planId$" name="planId$" 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="planQueryNameToRobBydirector"
                                   onkeyup="autoLoad(this.getAttribute('data-key'))">
                            <select class="cool-auto-complete-window-select"
                                    data-key="planQueryNameToRobBydirectorSelect"
                                    onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
                            </select>
                        </div>
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label layui-form-required">核价名: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" type="text" name="name" placeholder="核价名" autocomplete="off">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label layui-form-required">模板: </label>
                    <div class="layui-input-block">
                        <input type="radio" name="template" value="1" title="模板1" checked>
                        <div class="layui-unselect layui-form-radio"><i class="layui-anim layui-icon"></i>
                            <div>模板1</div>
                        </div>
                        <input type="radio" name="template" value="2" title="模板2" disabled>
                        <div class="layui-unselect layui-form-radio"><i class="layui-anim layui-icon"></i>
                            <div>模板2</div>
                        </div>
                    </div>
                </div>
            </div>
          </div>
        </div>
        <div class="layui-form-item">
          <label class="layui-form-label layui-form-required">核价名: </label>
          <div class="layui-input-block">
            <input class="layui-input" type="text" name="name" placeholder="核价名" autocomplete="off">
          </div>
        <hr class="layui-bg-gray">
        <div class="layui-form-item text-right">
            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">保存</button>
            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
        </div>
        <div class="layui-form-item">
          <label class="layui-form-label layui-form-required">模板: </label>
          <div class="layui-input-block">
            <input type="radio" name="template" value="1" title="模板1" checked><div class="layui-unselect layui-form-radio"><i class="layui-anim layui-icon"></i><div>模板1</div></div>
            <input type="radio" name="template" value="2" title="模板2" disabled><div class="layui-unselect layui-form-radio"><i class="layui-anim layui-icon"></i><div>模板2</div></div>
          </div>
        </div>
      </div>
    </div>
    <hr class="layui-bg-gray">
    <div class="layui-form-item text-right">
      <button class="layui-btn" lay-filter="editSubmit" lay-submit="">保存</button>
      <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
    </div>
  </div>
</script>
<!-- 表单弹窗 -->
<script type="text/html" id="editStatus">
  <div id="editStatusDetail" lay-filter="editStatusDetail" class="layui-form admin-form model-form">
    <input name="id" type="hidden">
    <div class="layui-row">
      <div class="layui-col-md12">
        <div class="layui-form-item">
          <label class="layui-form-label layui-form-required">状态: </label>
          <div class="layui-input-block">
            <select name="status" lay-vertype="tips" lay-verify="required">
              <option value="">请选择状态</option>
              <option value="1">已完成</option>
              <option value="0">未完成</option>
            </select>
          </div>
        </div>
    <div id="editStatusDetail" lay-filter="editStatusDetail" class="layui-form admin-form model-form">
        <input name="id" type="hidden">
        <div class="layui-row">
            <div class="layui-col-md12">
                <div class="layui-form-item">
                    <label class="layui-form-label layui-form-required">状态: </label>
                    <div class="layui-input-block">
                        <select name="status" lay-vertype="tips" lay-verify="required">
                            <option value="">请选择状态</option>
                            <option value="1">已完成</option>
                            <option value="0">未完成</option>
                        </select>
                    </div>
                </div>
        <div class="layui-form-item">
          <label class="layui-form-label layui-form-required">核价名: </label>
          <div class="layui-input-block">
            <input class="layui-input" name="templateName" 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" name="templateName" 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" name="title" 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" name="title" placeholder="请输入表格标题" autocomplete="off"
                               lay-verify="required">
                    </div>
                </div>
      </div>
            </div>
        </div>
        <hr class="layui-bg-gray">
        <div class="layui-form-item text-right">
            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">保存</button>
            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
        </div>
    </div>
    <hr class="layui-bg-gray">
    <div class="layui-form-item text-right">
      <button class="layui-btn" lay-filter="editSubmit" lay-submit="">保存</button>
      <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
    </div>
  </div>
</script>
</body>
</html>
src/main/webapp/views/priOnline2/priOnline_check.html
@@ -1,271 +1,280 @@
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>excel</title>
  <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
  <link rel='stylesheet' href='../../static/plugins/css/pluginsCss.css' />
  <link rel='stylesheet' href='../../static/plugins/plugins.css' />
  <link rel='stylesheet' href='../../static/css/luckysheet.css' />
  <link rel='stylesheet' href='../../static/assets/iconfont/iconfont.css' />
  <script src="../../static/js/luckysheet_js/plugin.js"></script>
  <script src="../../static/js/luckysheet_js/luckysheet.umd.js"></script>
  <script src="../../static/js/luckysheet_js/luckyexcel.umd.js"></script>
  <script src="../../static/js/luckysheet_js/exceljs.min.js"></script>
  <script type="text/javascript" src="../../static/js/luckysheet_js/export.js" charset="utf-8"></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/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/luckysheet_js/print.min.js" charset="utf-8"></script>
    <meta charset="utf-8">
    <title>excel</title>
    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
    <link rel='stylesheet' href='../../static/plugins/css/pluginsCss.css'/>
    <link rel='stylesheet' href='../../static/plugins/plugins.css'/>
    <link rel='stylesheet' href='../../static/css/luckysheet.css'/>
    <link rel='stylesheet' href='../../static/assets/iconfont/iconfont.css'/>
    <script src="../../static/js/luckysheet_js/plugin.js"></script>
    <script src="../../static/js/luckysheet_js/luckysheet.umd.js"></script>
    <script src="../../static/js/luckysheet_js/luckyexcel.umd.js"></script>
    <script src="../../static/js/luckysheet_js/exceljs.min.js"></script>
    <script type="text/javascript" src="../../static/js/luckysheet_js/export.js" charset="utf-8"></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/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/luckysheet_js/print.min.js" charset="utf-8"></script>
</head>
<body>
<div style="display: flex;position: absolute;top: 20px;left:30px;z-index: 9999;">
  <!--  <div><button type="button" id="export">导出Execel</button></div>-->
<!--  <div><button type="button" id="save">保存到服务器</button></div>-->
<!--  <div><button type="button" id="otherSave">另保存到服务器</button></div>-->
  <div><button type="button" class="layui-btn layui-btn-primary layui-btn-xs btn-edit" id="allprint">全部打印</button></div>
  <div><button type="button" class="layui-btn layui-btn-primary layui-btn-xs btn-edit" id="print">选区打印</button></div>
  <div><button type="button" class="layui-btn layui-btn-primary layui-btn-xs btn-edit" id="download">下载</button></div>
    <!--  <div><button type="button" id="export">导出Execel</button></div>-->
    <!--  <div><button type="button" id="save">保存到服务器</button></div>-->
    <!--  <div><button type="button" id="otherSave">另保存到服务器</button></div>-->
    <div>
        <button type="button" class="layui-btn layui-btn-primary layui-btn-xs btn-edit" id="allprint">全部打印</button>
    </div>
    <div>
        <button type="button" class="layui-btn layui-btn-primary layui-btn-xs btn-edit" id="print">选区打印</button>
    </div>
    <div>
        <button type="button" class="layui-btn layui-btn-primary layui-btn-xs btn-edit" id="download">下载</button>
    </div>
</div>
<div id="luckysheet" style="margin:0px;padding:0px;position:absolute;width:100%;height: 100vh;left: 0px;top: 0px;"></div>
<div id="luckysheet"
     style="margin:0px;padding:0px;position:absolute;width:100%;height: 100vh;left: 0px;top: 0px;"></div>
<script>
  $(function () {
    var layer = layui.layer;
    $(function () {
        var layer = layui.layer;
    //配置项
    var options = {
      container: 'luckysheet' ,//luckysheet为容器id
      title: '查看询价', //工作簿名称
      lang: 'zh', //设定表格语言 国际化设置,允许设置表格的语言,支持中文("zh")和英文("en")
      allowEdit: true, //是否允许前台编辑
      sheetFormulaBar: true, //是否显示公式栏
      forceCalculation: true,//强制计算公式
      myFolderUrl: '' //左上角<返回按钮的链接
    }
        //配置项
        var options = {
            container: 'luckysheet',//luckysheet为容器id
            title: '查看询价', //工作簿名称
            lang: 'zh', //设定表格语言 国际化设置,允许设置表格的语言,支持中文("zh")和英文("en")
            allowEdit: true, //是否允许前台编辑
            sheetFormulaBar: true, //是否显示公式栏
            forceCalculation: true,//强制计算公式
            myFolderUrl: '' //左上角<返回按钮的链接
        }
    let checkDataFile = "";
        let checkDataFile = "";
    if(getUrlParams('id') == false || getUrlParams('id') == undefined){
      //新增
      luckysheet.create(options)
      $("#luckysheet_info_detail_update").hide()
      $("#luckysheet_info_detail_save").hide()
      $("#luckysheet_info_detail_title").hide()
    }else{
      //修改
      $.ajax({
        type:"get",
        url: baseUrl + "/priOnline2/viewCheck/" + getUrlParams('id') + "/auth",
        dataType:"json",
        headers: {'token': localStorage.getItem('token')},
        success:function(res) {
          if (res.code == 200) {
            checkDataFile = res.data.checkDataFile
            options.data = unzip(res.data.checkData)
        if (getUrlParams('id') == false || getUrlParams('id') == undefined) {
            //新增
            luckysheet.create(options)
            $("#luckysheet_info_detail_update").hide()
            $("#luckysheet_info_detail_save").hide()
            $("#luckysheet_info_detail_title").hide()
          }else {
            layer.msg(res.msg,{time:1000})
          }
        } else {
            //修改
            $.ajax({
                type: "get",
                url: baseUrl + "/priOnline2/viewCheck/" + getUrlParams('id') + "/auth",
                dataType: "json",
                headers: {'token': localStorage.getItem('token')},
                success: function (res) {
                    if (res.code == 200) {
                        checkDataFile = res.data.checkDataFile
                        options.data = unzip(res.data.checkData)
                        luckysheet.create(options)
                        $("#luckysheet_info_detail_update").hide()
                        $("#luckysheet_info_detail_save").hide()
                        $("#luckysheet_info_detail_title").hide()
                    } else {
                        layer.msg(res.msg, {time: 1000})
                    }
                }
            });
        }
      });
    }
    $("#export").on("click",() => {
      console.log('export')
      exportExcel(luckysheet.getluckysheetfile()).then((e) => {
        saveFile(e,'file');
      })
    })
    //保存到服务器
    $("#save").on("click",() => {
      if(getUrlParams('id') == false || getUrlParams('id') == undefined){
        //新增
        $.ajax({
          url: baseUrl + "/priOnline2/add/auth",
          headers: {'token': localStorage.getItem('token')},
          data: JSON.stringify({
            title: luckysheet.toJson().title,
            sheetData: zip(luckysheet.getAllSheets()),
            itemId: getUrlParams('item_id'),
            priId: getUrlParams('pri_id')
          }),
          method: 'POST',
          dataType: "json",
          contentType:'application/json;charset=UTF-8',
          success: function (res) {
            if (res.code == 200) {
              layer.msg('保存成功',{time:1000},() => {
                parent.location.reload()
              })
            }else{
              layer.msg(res.msg,{time:1000})
            }
          }
        $("#export").on("click", () => {
            console.log('export')
            exportExcel(luckysheet.getluckysheetfile()).then((e) => {
                saveFile(e, 'file');
            })
        })
      }else {
        //修改
        $.ajax({
          url: baseUrl + "/priOnline2/update/auth",
          headers: {'token': localStorage.getItem('token')},
          data: JSON.stringify({
            id: getUrlParams('id'),
            title: luckysheet.toJson().title,
            sheetData: zip(luckysheet.getAllSheets())
          }),
          method: 'POST',
          dataType: "json",
          contentType:'application/json;charset=UTF-8',
          success: function (res) {
            if (res.code == 200) {
              layer.msg('保存成功',{time:1000},() => {
                parent.location.reload()
              })
            }else{
              layer.msg(res.msg,{time:1000})
        //保存到服务器
        $("#save").on("click", () => {
            if (getUrlParams('id') == false || getUrlParams('id') == undefined) {
                //新增
                $.ajax({
                    url: baseUrl + "/priOnline2/add/auth",
                    headers: {'token': localStorage.getItem('token')},
                    data: JSON.stringify({
                        title: luckysheet.toJson().title,
                        sheetData: zip(luckysheet.getAllSheets()),
                        itemId: getUrlParams('item_id'),
                        priId: getUrlParams('pri_id')
                    }),
                    method: 'POST',
                    dataType: "json",
                    contentType: 'application/json;charset=UTF-8',
                    success: function (res) {
                        if (res.code == 200) {
                            layer.msg('保存成功', {time: 1000}, () => {
                                parent.location.reload()
                            })
                        } else {
                            layer.msg(res.msg, {time: 1000})
                        }
                    }
                })
            } else {
                //修改
                $.ajax({
                    url: baseUrl + "/priOnline2/update/auth",
                    headers: {'token': localStorage.getItem('token')},
                    data: JSON.stringify({
                        id: getUrlParams('id'),
                        title: luckysheet.toJson().title,
                        sheetData: zip(luckysheet.getAllSheets())
                    }),
                    method: 'POST',
                    dataType: "json",
                    contentType: 'application/json;charset=UTF-8',
                    success: function (res) {
                        if (res.code == 200) {
                            layer.msg('保存成功', {time: 1000}, () => {
                                parent.location.reload()
                            })
                        } else {
                            layer.msg(res.msg, {time: 1000})
                        }
                    }
                })
            }
          }
        })
      }
        $("#download").on("click", () => {
            window.open(baseUrl + "/priOnline2/checkDataDownload/" + checkDataFile)
        })
    })
    $("#download").on("click",() => {
      window.open(baseUrl + "/priOnline2/checkDataDownload/" +checkDataFile)
    $("#allprint").on("click", () => {
        printExcel()
    })
  })
    $("#print").on("click", () => {
        let src = luckysheet.getScreenshot(); // 生成base64图片
        const style = '@page {margin:0 10mm};'
        printJS({
            printable: src,
            type: 'image',
            style: style
        }) // Print.js插件
    })
  $("#allprint").on("click",() => {
    printExcel()
  })
    // 获取表格中包含内容的row,column
    function getExcelRowColumn() {
        const sheetData = luckysheet.getSheetData();
        let objRowColumn = {
            row: [null, null], //行
            column: [null, null], //列
        };
        sheetData.forEach((item, index) => {
            //行数
            item.forEach((it, itemIndex) => {
                if (it !== null) {
                    if (objRowColumn.row[0] == null) objRowColumn.row[0] = index; // row第一位
                    objRowColumn.row[1] = index; //row第二位
                    if (objRowColumn.column[0] == null)
                        objRowColumn.column[0] = itemIndex; //column第一位
                    objRowColumn.column[1] = itemIndex; //column第二位
                }
            });
        });
        return objRowColumn;
    }
  $("#print").on("click",() => {
    let src = luckysheet.getScreenshot(); // 生成base64图片
    const style = '@page {margin:0 10mm};'
    printJS({
      printable: src,
      type: 'image',
      style: style
    }) // Print.js插件
  })
    function printExcel() {
        let RowColumn = this.getExcelRowColumn() // 获取有值的行和列
        RowColumn.column[0] = 0 //因需要打印左边的边框,需重新设置
        luckysheet.setRangeShow(RowColumn) // 进行选区操作
        let src = luckysheet.getScreenshot(); // 生成base64图片
        const style = '@page {margin:0 10mm};'
        printJS({
            printable: src,
            type: 'image',
            style: style
        }) // Print.js插件
    }
  // 获取表格中包含内容的row,column
  function getExcelRowColumn() {
    const sheetData = luckysheet.getSheetData();
    let objRowColumn = {
      row: [null, null], //行
      column: [null, null], //列
    };
    sheetData.forEach((item, index) => {
      //行数
      item.forEach((it, itemIndex) => {
        if (it !== null) {
          if (objRowColumn.row[0] == null) objRowColumn.row[0] = index; // row第一位
          objRowColumn.row[1] = index; //row第二位
          if (objRowColumn.column[0] == null)
            objRowColumn.column[0] = itemIndex; //column第一位
          objRowColumn.column[1] = itemIndex; //column第二位
    function getUrlParams(name) {
        var url = window.location.search;
        if (url.indexOf('?') == -1) {
            return false;
        }
      });
    });
    return objRowColumn;
  }
  function printExcel() {
    let RowColumn = this.getExcelRowColumn() // 获取有值的行和列
    RowColumn.column[0] = 0 //因需要打印左边的边框,需重新设置
    luckysheet.setRangeShow(RowColumn) // 进行选区操作
    let src = luckysheet.getScreenshot(); // 生成base64图片
    const style = '@page {margin:0 10mm};'
    printJS({
      printable: src,
      type: 'image',
      style: style
    }) // Print.js插件
  }
  function getUrlParams(name) {
    var url = window.location.search;
    if (url.indexOf('?') == -1) { return false; }
    url = url.substr(1);
    url = url.split('&');
    var name = name || '';
    var nameres;
    for (var i = 0; i < url.length; i++) {
      var info = url[i].split('=');
      var obj = {};
      obj[info[0]] = decodeURI(info[1]);
      url[i] = obj;
    }
    if (name) {
      for (var i = 0; i < url.length; i++) {
        for (var key in url[i]) {
          if (key == name) {
            nameres = url[i][key];
          }
        url = url.substr(1);
        url = url.split('&');
        var name = name || '';
        var nameres;
        for (var i = 0; i < url.length; i++) {
            var info = url[i].split('=');
            var obj = {};
            obj[info[0]] = decodeURI(info[1]);
            url[i] = obj;
        }
      }
    } else {
      nameres = url;
        if (name) {
            for (var i = 0; i < url.length; i++) {
                for (var key in url[i]) {
                    if (key == name) {
                        nameres = url[i][key];
                    }
                }
            }
        } else {
            nameres = url;
        }
        return nameres;
    }
    return nameres;
  }
  // 压缩
  function zip(data) {
    if (!data) return data
    // 判断数据是否需要转为JSON
    const dataJson = typeof data !== 'string' && typeof data !== 'number' ? JSON.stringify(data) : data
    // 压缩
    function zip(data) {
        if (!data) return data
        // 判断数据是否需要转为JSON
        const dataJson = typeof data !== 'string' && typeof data !== 'number' ? JSON.stringify(data) : data
    // 使用Base64.encode处理字符编码,兼容中文
    const str = Base64.encode(dataJson)
    let binaryString = pako.gzip(str);
    let arr = Array.from(binaryString);
    let s = "";
    arr.forEach((item, index) => {
      s += String.fromCharCode(item)
    })
    return btoa(s)
  }
  // 解压
  function unzip(b64Data) {
    let strData = atob(b64Data);
    let charData = strData.split('').map(function (x) {
      return x.charCodeAt(0);
    });
    let binData = new Uint8Array(charData);
    let data = pako.ungzip(binData);
    // ↓切片处理数据,防止内存溢出报错↓
    let str = '';
    const chunk = 8 * 1024
    let i;
    for (i = 0; i < data.length / chunk; i++) {
      str += String.fromCharCode.apply(null, data.slice(i * chunk, (i + 1) * chunk));
        // 使用Base64.encode处理字符编码,兼容中文
        const str = Base64.encode(dataJson)
        let binaryString = pako.gzip(str);
        let arr = Array.from(binaryString);
        let s = "";
        arr.forEach((item, index) => {
            s += String.fromCharCode(item)
        })
        return btoa(s)
    }
    str += String.fromCharCode.apply(null, data.slice(i * chunk));
    // ↑切片处理数据,防止内存溢出报错↑
    const unzipStr = Base64.decode(str);
    let result = ''
    // 解压
    function unzip(b64Data) {
        let strData = atob(b64Data);
        let charData = strData.split('').map(function (x) {
            return x.charCodeAt(0);
        });
        let binData = new Uint8Array(charData);
        let data = pako.ungzip(binData);
    // 对象或数组进行JSON转换
    try {
      result = JSON.parse(unzipStr)
    } catch (error) {
      if (/Unexpected token o in JSON at position 0/.test(error)) {
        // 如果没有转换成功,代表值为基本数据,直接赋值
        result = unzipStr
      }
        // ↓切片处理数据,防止内存溢出报错↓
        let str = '';
        const chunk = 8 * 1024
        let i;
        for (i = 0; i < data.length / chunk; i++) {
            str += String.fromCharCode.apply(null, data.slice(i * chunk, (i + 1) * chunk));
        }
        str += String.fromCharCode.apply(null, data.slice(i * chunk));
        // ↑切片处理数据,防止内存溢出报错↑
        const unzipStr = Base64.decode(str);
        let result = ''
        // 对象或数组进行JSON转换
        try {
            result = JSON.parse(unzipStr)
        } catch (error) {
            if (/Unexpected token o in JSON at position 0/.test(error)) {
                // 如果没有转换成功,代表值为基本数据,直接赋值
                result = unzipStr
            }
        }
        return result
    }
    return result
  }
</script>
</body>
</html>
src/main/webapp/views/priOnline2/priOnline_detail.html
@@ -1,340 +1,352 @@
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>excel</title>
  <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
  <link rel='stylesheet' href='../../static/plugins/css/pluginsCss.css' />
  <link rel='stylesheet' href='../../static/plugins/plugins.css' />
  <link rel='stylesheet' href='../../static/css/luckysheet.css' />
  <link rel='stylesheet' href='../../static/assets/iconfont/iconfont.css' />
  <script src="../../static/js/luckysheet_js/plugin.js"></script>
  <script src="../../static/js/luckysheet_js/luckysheet.umd.js"></script>
  <script src="../../static/js/luckysheet_js/luckyexcel.umd.js"></script>
  <script src="../../static/js/luckysheet_js/exceljs.min.js"></script>
  <script type="text/javascript" src="../../static/js/luckysheet_js/export.js" charset="utf-8"></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/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/luckysheet_js/print.min.js" charset="utf-8"></script>
    <meta charset="utf-8">
    <title>excel</title>
    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
    <link rel='stylesheet' href='../../static/plugins/css/pluginsCss.css'/>
    <link rel='stylesheet' href='../../static/plugins/plugins.css'/>
    <link rel='stylesheet' href='../../static/css/luckysheet.css'/>
    <link rel='stylesheet' href='../../static/assets/iconfont/iconfont.css'/>
    <script src="../../static/js/luckysheet_js/plugin.js"></script>
    <script src="../../static/js/luckysheet_js/luckysheet.umd.js"></script>
    <script src="../../static/js/luckysheet_js/luckyexcel.umd.js"></script>
    <script src="../../static/js/luckysheet_js/exceljs.min.js"></script>
    <script type="text/javascript" src="../../static/js/luckysheet_js/export.js" charset="utf-8"></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/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/luckysheet_js/print.min.js" charset="utf-8"></script>
</head>
<body>
<div style="display: flex;position: absolute;top: 20px;left:30px;z-index: 9999;">
<!--  <div>上传Execel:<input type="file" id="Luckyexcel-demo-file" /></div>-->
<!--  <div><button type="button" id="export">导出Execel</button></div>-->
  <div><button type="button" class="layui-btn layui-btn-primary layui-btn-xs btn-edit" id="save">保存</button></div>
  <div><button type="button" class="layui-btn layui-btn-primary layui-btn-xs btn-edit" id="otherSave">另存为</button></div>
  <div><button type="button" class="layui-btn layui-btn-primary layui-btn-xs btn-edit" id="allprint">全部打印</button></div>
  <div><button type="button" class="layui-btn layui-btn-primary layui-btn-xs btn-edit" id="print">选区打印</button></div>
    <!--  <div>上传Execel:<input type="file" id="Luckyexcel-demo-file" /></div>-->
    <!--  <div><button type="button" id="export">导出Execel</button></div>-->
    <div>
        <button type="button" class="layui-btn layui-btn-primary layui-btn-xs btn-edit" id="save">保存</button>
    </div>
    <div>
        <button type="button" class="layui-btn layui-btn-primary layui-btn-xs btn-edit" id="otherSave">另存为</button>
    </div>
    <div>
        <button type="button" class="layui-btn layui-btn-primary layui-btn-xs btn-edit" id="allprint">全部打印</button>
    </div>
    <div>
        <button type="button" class="layui-btn layui-btn-primary layui-btn-xs btn-edit" id="print">选区打印</button>
    </div>
</div>
<div id="luckysheet" style="margin:0px;padding:0px;position:absolute;width:100%;height: 100vh;left: 0px;top: 0px;"></div>
<div id="luckysheet"
     style="margin:0px;padding:0px;position:absolute;width:100%;height: 100vh;left: 0px;top: 0px;"></div>
<script>
  $(function () {
    var layer = layui.layer;
    $(function () {
        var layer = layui.layer;
    //配置项
    var options = {
      container: 'luckysheet' ,//luckysheet为容器id
      title: '在线核价', //工作簿名称
      lang: 'zh', //设定表格语言 国际化设置,允许设置表格的语言,支持中文("zh")和英文("en")
      allowEdit: true, //是否允许前台编辑
      sheetFormulaBar: true, //是否显示公式栏
      forceCalculation: true,//强制计算公式
      myFolderUrl: '' //左上角<返回按钮的链接
    }
        //配置项
        var options = {
            container: 'luckysheet',//luckysheet为容器id
            title: '在线核价', //工作簿名称
            lang: 'zh', //设定表格语言 国际化设置,允许设置表格的语言,支持中文("zh")和英文("en")
            allowEdit: true, //是否允许前台编辑
            sheetFormulaBar: true, //是否显示公式栏
            forceCalculation: true,//强制计算公式
            myFolderUrl: '', //左上角<返回按钮的链接
            allowEdit: true // 是否允许前台编辑
        }
    if(getUrlParams('id') == false || getUrlParams('id') == undefined){
      //新增
      if(getUrlParams('template') == false || getUrlParams('template') == undefined){
        luckysheet.create(options)
        $("#luckysheet_info_detail_update").hide()
        $("#luckysheet_info_detail_save").hide()
        $("#luckysheet_info_detail_title").hide()
      }else {
        $.ajax({
          type:"get",
          url: baseUrl + "/static/js/priOnline2/data" + getUrlParams('template') + ".txt",
          success:function(sheetData) {
            options.data = unzip(sheetData)
            options.title = getUrlParams('name')
            luckysheet.create(options)
            $("#luckysheet_info_detail_update").hide()
            $("#luckysheet_info_detail_save").hide()
            $("#luckysheet_info_detail_title").hide()
          }
        if (getUrlParams('id') == false || getUrlParams('id') == undefined) {
            //新增
            if (getUrlParams('template') == false || getUrlParams('template') == undefined) {
                luckysheet.create(options)
                $("#luckysheet_info_detail_update").hide()
                $("#luckysheet_info_detail_save").hide()
                $("#luckysheet_info_detail_title").hide()
            } else {
                $.ajax({
                    type: "get",
                    url: baseUrl + "/static/js/priOnline2/data" + getUrlParams('template') + ".txt",
                    success: function (sheetData) {
                        options.data = unzip(sheetData)
                        options.title = getUrlParams('name')
                        luckysheet.create(options)
                        $("#luckysheet_info_detail_update").hide()
                        $("#luckysheet_info_detail_save").hide()
                        $("#luckysheet_info_detail_title").hide()
                    }
                });
            }
        } else {
            //修改
            $.ajax({
                type: "get",
                url: baseUrl + "/priOnline2/" + getUrlParams('id') + "/auth",
                dataType: "json",
                headers: {'token': localStorage.getItem('token')},
                success: function (res) {
                    options.data = unzip(res.data.sheetData)
                    options.title = res.data.title
                    luckysheet.create(options)
                    $("#luckysheet_info_detail_update").hide()
                    $("#luckysheet_info_detail_save").hide()
                    $("#luckysheet_info_detail_title").hide()
                }
            });
        }
        $("#Luckyexcel-demo-file").on("change", (evt) => {
            var files = evt.target.files;
            if (files == null || files.length == 0) {
                alert("No files wait for import");
                return;
            }
            let name = files[0].name;
            let suffixArr = name.split("."), suffix = suffixArr[suffixArr.length - 1];
            if (suffix != "xlsx") {
                alert("Currently only supports the import of xlsx files");
                return;
            }
            LuckyExcel.transformExcelToLucky(files[0], function (exportJson, luckysheetfile) {
                if (exportJson.sheets == null || exportJson.sheets.length == 0) {
                    alert("Failed to read the content of the excel file, currently does not support xls files!");
                    return;
                }
                window.luckysheet.destroy();
                window.luckysheet.create({
                    container: 'luckysheet', //luckysheet is the container id
                    data: exportJson.sheets,
                    title: exportJson.info.name,
                    userInfo: exportJson.info.name.creator,
                    lang: 'zh', //设定表格语言 国际化设置,允许设置表格的语言,支持中文("zh")和英文("en")
                    allowEdit: true, //是否允许前台编辑
                    sheetFormulaBar: true, //是否显示公式栏
                    forceCalculation: true,//强制计算公式
                });
            });
        })
        $("#export").on("click", () => {
            console.log('export')
            exportExcel(luckysheet.getluckysheetfile()).then((e) => {
                saveFile(e, 'file');
            })
        })
        //保存到服务器
        $("#save").on("click", () => {
            if (getUrlParams('id') == false || getUrlParams('id') == undefined) {
                //新增
                $.ajax({
                    url: baseUrl + "/priOnline2/add/auth",
                    headers: {'token': localStorage.getItem('token')},
                    data: JSON.stringify({
                        title: luckysheet.toJson().title,
                        sheetData: zip(luckysheet.getAllSheets()),
                        itemId: getUrlParams('item_id'),
                        priId: getUrlParams('pri_id')
                    }),
                    method: 'POST',
                    dataType: "json",
                    contentType: 'application/json;charset=UTF-8',
                    success: function (res) {
                        if (res.code == 200) {
                            layer.msg('保存成功', {time: 1000}, () => {
                                parent.location.reload()
                            })
                        } else {
                            layer.msg(res.msg, {time: 1000})
                        }
                    }
                })
            } else {
                //修改
                $.ajax({
                    url: baseUrl + "/priOnline2/update/auth",
                    headers: {'token': localStorage.getItem('token')},
                    data: JSON.stringify({
                        id: getUrlParams('id'),
                        title: luckysheet.toJson().title,
                        sheetData: zip(luckysheet.getAllSheets())
                    }),
                    method: 'POST',
                    dataType: "json",
                    contentType: 'application/json;charset=UTF-8',
                    success: function (res) {
                        if (res.code == 200) {
                            layer.msg('保存成功', {time: 1000}, () => {
                                parent.location.reload()
                            })
                        } else {
                            layer.msg(res.msg, {time: 1000})
                        }
                    }
                })
            }
        })
        $("#otherSave").on("click", () => {
            if (getUrlParams('id') == false || getUrlParams('id') == undefined) {
                //新建文件
                $("#save").trigger("click")
            } else {
                //另存
                $.ajax({
                    url: baseUrl + "/priOnline2/addOther/auth",
                    headers: {'token': localStorage.getItem('token')},
                    data: JSON.stringify({
                        id: getUrlParams('id'),
                        title: luckysheet.toJson().title,
                        sheetData: zip(luckysheet.getAllSheets())
                    }),
                    method: 'POST',
                    dataType: "json",
                    contentType: 'application/json;charset=UTF-8',
                    success: function (res) {
                        if (res.code == 200) {
                            layer.msg('另存成功', {time: 1000}, () => {
                                parent.location.reload()
                            })
                        } else {
                            layer.msg('保存失败', {time: 1000})
                        }
                    }
                })
            }
        })
    })
    $("#allprint").on("click", () => {
        printExcel()
    })
    $("#print").on("click", () => {
        let src = luckysheet.getScreenshot(); // 生成base64图片
        const style = '@page {margin:0 10mm};'
        printJS({
            printable: src,
            type: 'image',
            style: style
        }) // Print.js插件
    })
    // 获取表格中包含内容的row,column
    function getExcelRowColumn() {
        const sheetData = luckysheet.getSheetData();
        let objRowColumn = {
            row: [null, null], //行
            column: [null, null], //列
        };
        sheetData.forEach((item, index) => {
            //行数
            item.forEach((it, itemIndex) => {
                if (it !== null) {
                    if (objRowColumn.row[0] == null) objRowColumn.row[0] = index; // row第一位
                    objRowColumn.row[1] = index; //row第二位
                    if (objRowColumn.column[0] == null)
                        objRowColumn.column[0] = itemIndex; //column第一位
                    objRowColumn.column[1] = itemIndex; //column第二位
                }
            });
        });
      }
    }else{
      //修改
      $.ajax({
        type:"get",
        url: baseUrl + "/priOnline2/" + getUrlParams('id') + "/auth",
        dataType:"json",
        headers: {'token': localStorage.getItem('token')},
        success:function(res) {
          options.data = unzip(res.data.sheetData)
          options.title = res.data.title
          luckysheet.create(options)
          $("#luckysheet_info_detail_update").hide()
          $("#luckysheet_info_detail_save").hide()
          $("#luckysheet_info_detail_title").hide()
        }
      });
        return objRowColumn;
    }
    $("#Luckyexcel-demo-file").on("change",(evt) => {
      var files = evt.target.files;
      if(files==null || files.length==0){
        alert("No files wait for import");
        return;
      }
    function printExcel() {
        let RowColumn = this.getExcelRowColumn() // 获取有值的行和列
        RowColumn.column[0] = 0 //因需要打印左边的边框,需重新设置
        luckysheet.setRangeShow(RowColumn) // 进行选区操作
        let src = luckysheet.getScreenshot(); // 生成base64图片
        const style = '@page {margin:0 10mm};'
        printJS({
            printable: src,
            type: 'image',
            style: style
        }) // Print.js插件
    }
      let name = files[0].name;
      let suffixArr = name.split("."), suffix = suffixArr[suffixArr.length-1];
      if(suffix!="xlsx"){
        alert("Currently only supports the import of xlsx files");
        return;
      }
      LuckyExcel.transformExcelToLucky(files[0], function(exportJson, luckysheetfile){
        if(exportJson.sheets==null || exportJson.sheets.length==0){
          alert("Failed to read the content of the excel file, currently does not support xls files!");
          return;
    function getUrlParams(name) {
        var url = window.location.search;
        if (url.indexOf('?') == -1) {
            return false;
        }
        window.luckysheet.destroy();
        url = url.substr(1);
        url = url.split('&');
        var name = name || '';
        var nameres;
        for (var i = 0; i < url.length; i++) {
            var info = url[i].split('=');
            var obj = {};
            obj[info[0]] = decodeURI(info[1]);
            url[i] = obj;
        }
        if (name) {
            for (var i = 0; i < url.length; i++) {
                for (var key in url[i]) {
                    if (key == name) {
                        nameres = url[i][key];
                    }
                }
            }
        } else {
            nameres = url;
        }
        return nameres;
    }
        window.luckysheet.create({
          container: 'luckysheet', //luckysheet is the container id
          data:exportJson.sheets,
          title:exportJson.info.name,
          userInfo:exportJson.info.name.creator,
          lang: 'zh', //设定表格语言 国际化设置,允许设置表格的语言,支持中文("zh")和英文("en")
          allowEdit: true, //是否允许前台编辑
          sheetFormulaBar: true, //是否显示公式栏
          forceCalculation: true,//强制计算公式
    // 压缩
    function zip(data) {
        if (!data) return data
        // 判断数据是否需要转为JSON
        const dataJson = typeof data !== 'string' && typeof data !== 'number' ? JSON.stringify(data) : data
        // 使用Base64.encode处理字符编码,兼容中文
        const str = Base64.encode(dataJson)
        let binaryString = pako.gzip(str);
        let arr = Array.from(binaryString);
        let s = "";
        arr.forEach((item, index) => {
            s += String.fromCharCode(item)
        })
        return btoa(s)
    }
    // 解压
    function unzip(b64Data) {
        let strData = atob(b64Data);
        let charData = strData.split('').map(function (x) {
            return x.charCodeAt(0);
        });
      });
    })
        let binData = new Uint8Array(charData);
        let data = pako.ungzip(binData);
    $("#export").on("click",() => {
      console.log('export')
      exportExcel(luckysheet.getluckysheetfile()).then((e) => {
        saveFile(e,'file');
      })
    })
    //保存到服务器
    $("#save").on("click",() => {
      if(getUrlParams('id') == false || getUrlParams('id') == undefined){
        //新增
        $.ajax({
          url: baseUrl + "/priOnline2/add/auth",
          headers: {'token': localStorage.getItem('token')},
          data: JSON.stringify({
            title: luckysheet.toJson().title,
            sheetData: zip(luckysheet.getAllSheets()),
            itemId: getUrlParams('item_id'),
            priId: getUrlParams('pri_id')
          }),
          method: 'POST',
          dataType: "json",
          contentType:'application/json;charset=UTF-8',
          success: function (res) {
            if (res.code == 200) {
              layer.msg('保存成功',{time:1000},() => {
                parent.location.reload()
              })
            }else{
              layer.msg(res.msg,{time:1000})
            }
          }
        })
      }else {
        //修改
        $.ajax({
          url: baseUrl + "/priOnline2/update/auth",
          headers: {'token': localStorage.getItem('token')},
          data: JSON.stringify({
            id: getUrlParams('id'),
            title: luckysheet.toJson().title,
            sheetData: zip(luckysheet.getAllSheets())
          }),
          method: 'POST',
          dataType: "json",
          contentType:'application/json;charset=UTF-8',
          success: function (res) {
            if (res.code == 200) {
              layer.msg('保存成功',{time:1000},() => {
                parent.location.reload()
              })
            }else{
              layer.msg(res.msg,{time:1000})
            }
          }
        })
      }
    })
    $("#otherSave").on("click",() => {
      if(getUrlParams('id') == false || getUrlParams('id') == undefined){
        //新建文件
        $("#save").trigger("click")
      }else {
        //另存
        $.ajax({
          url: baseUrl + "/priOnline2/addOther/auth",
          headers: {'token': localStorage.getItem('token')},
          data: JSON.stringify({
            id: getUrlParams('id'),
            title: luckysheet.toJson().title,
            sheetData: zip(luckysheet.getAllSheets())
          }),
          method: 'POST',
          dataType: "json",
          contentType:'application/json;charset=UTF-8',
          success: function (res) {
            if (res.code == 200) {
              layer.msg('另存成功',{time:1000},() => {
                parent.location.reload()
              })
            }else{
              layer.msg('保存失败',{time:1000})
            }
          }
        })
      }
    })
  })
  $("#allprint").on("click",() => {
    printExcel()
  })
  $("#print").on("click",() => {
    let src = luckysheet.getScreenshot(); // 生成base64图片
    const style = '@page {margin:0 10mm};'
    printJS({
      printable: src,
      type: 'image',
      style: style
    }) // Print.js插件
  })
  // 获取表格中包含内容的row,column
  function getExcelRowColumn() {
    const sheetData = luckysheet.getSheetData();
    let objRowColumn = {
      row: [null, null], //行
      column: [null, null], //列
    };
    sheetData.forEach((item, index) => {
      //行数
      item.forEach((it, itemIndex) => {
        if (it !== null) {
          if (objRowColumn.row[0] == null) objRowColumn.row[0] = index; // row第一位
          objRowColumn.row[1] = index; //row第二位
          if (objRowColumn.column[0] == null)
            objRowColumn.column[0] = itemIndex; //column第一位
          objRowColumn.column[1] = itemIndex; //column第二位
        // ↓切片处理数据,防止内存溢出报错↓
        let str = '';
        const chunk = 8 * 1024
        let i;
        for (i = 0; i < data.length / chunk; i++) {
            str += String.fromCharCode.apply(null, data.slice(i * chunk, (i + 1) * chunk));
        }
      });
    });
    return objRowColumn;
  }
        str += String.fromCharCode.apply(null, data.slice(i * chunk));
        // ↑切片处理数据,防止内存溢出报错↑
  function printExcel() {
    let RowColumn = this.getExcelRowColumn() // 获取有值的行和列
    RowColumn.column[0] = 0 //因需要打印左边的边框,需重新设置
    luckysheet.setRangeShow(RowColumn) // 进行选区操作
    let src = luckysheet.getScreenshot(); // 生成base64图片
    const style = '@page {margin:0 10mm};'
    printJS({
      printable: src,
      type: 'image',
      style: style
    }) // Print.js插件
  }
        const unzipStr = Base64.decode(str);
        let result = ''
  function getUrlParams(name) {
    var url = window.location.search;
    if (url.indexOf('?') == -1) { return false; }
    url = url.substr(1);
    url = url.split('&');
    var name = name || '';
    var nameres;
    for (var i = 0; i < url.length; i++) {
      var info = url[i].split('=');
      var obj = {};
      obj[info[0]] = decodeURI(info[1]);
      url[i] = obj;
    }
    if (name) {
      for (var i = 0; i < url.length; i++) {
        for (var key in url[i]) {
          if (key == name) {
            nameres = url[i][key];
          }
        // 对象或数组进行JSON转换
        try {
            result = JSON.parse(unzipStr)
        } catch (error) {
            if (/Unexpected token o in JSON at position 0/.test(error)) {
                // 如果没有转换成功,代表值为基本数据,直接赋值
                result = unzipStr
            }
        }
      }
    } else {
      nameres = url;
        return result
    }
    return nameres;
  }
  // 压缩
  function zip(data) {
    if (!data) return data
    // 判断数据是否需要转为JSON
    const dataJson = typeof data !== 'string' && typeof data !== 'number' ? JSON.stringify(data) : data
    // 使用Base64.encode处理字符编码,兼容中文
    const str = Base64.encode(dataJson)
    let binaryString = pako.gzip(str);
    let arr = Array.from(binaryString);
    let s = "";
    arr.forEach((item, index) => {
      s += String.fromCharCode(item)
    })
    return btoa(s)
  }
  // 解压
  function unzip(b64Data) {
    let strData = atob(b64Data);
    let charData = strData.split('').map(function (x) {
      return x.charCodeAt(0);
    });
    let binData = new Uint8Array(charData);
    let data = pako.ungzip(binData);
    // ↓切片处理数据,防止内存溢出报错↓
    let str = '';
    const chunk = 8 * 1024
    let i;
    for (i = 0; i < data.length / chunk; i++) {
      str += String.fromCharCode.apply(null, data.slice(i * chunk, (i + 1) * chunk));
    }
    str += String.fromCharCode.apply(null, data.slice(i * chunk));
    // ↑切片处理数据,防止内存溢出报错↑
    const unzipStr = Base64.decode(str);
    let result = ''
    // 对象或数组进行JSON转换
    try {
      result = JSON.parse(unzipStr)
    } catch (error) {
      if (/Unexpected token o in JSON at position 0/.test(error)) {
        // 如果没有转换成功,代表值为基本数据,直接赋值
        result = unzipStr
      }
    }
    return result
  }
</script>
</body>
</html>
src/main/webapp/views/priOnline2/priOnline_more.html
@@ -3,6 +3,7 @@
    #formAdvForm {
        background-color: #f3f3f3;
    }
    #formAdvForm .layui-form-item {
        margin-top: 20px;
        margin-bottom: 0;
@@ -31,7 +32,8 @@
            <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 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>
@@ -74,7 +76,8 @@
    </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>
        <button class="layui-btn" lay-filter="refresh" lay-submit><i class="layui-icon">&#xe666;</i>&emsp;刷新&emsp;
        </button>
    </div>
</form>
@@ -132,7 +135,8 @@
        form.render('select');
        init();
        function init(){
        function init() {
            notice.msg('正在载入数据......', {icon: 4, position: "topRight"});
            $.ajax({
                url: baseUrl + "/priOnline2/" + priOnlineId + "/auth",
@@ -175,6 +179,7 @@
                type: 'datetime'
            });
        }
        layDateRender();
        /* 监听表单提交 */
src/main/webapp/views/processPermissions/processPermissions.html
@@ -40,11 +40,11 @@
                        <div class="layui-input-block">
                            <select name="process_memo">
                                <option value="">请选择状态</option>
                                <option value="1">核价流程</option>
                                <option value="1">规划流程</option>
                                <option value="2">报价流程</option>
                                <option value="3">报销流程</option>
<!--                                <option value="4">出差流程</option>-->
                                <option value="5">核价流程</option>
                                <option value="4">集成核价流程</option>
                                <option value="5">货架核价流程</option>
                                <option value="7">合同管理</option>
                                <option value="101">其它规划员</option>
                            </select>