935090232@qq.com
2022-03-06 00ddc0b477b262efdce4a20a034a871926188f61
Merge branch 'developer'
8 files modified
19 files added
1701 ■■■■■ changed files
zq-erp/src/main/java/com/matrix/core/enums/EnumApiShowAble.java 26 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/core/enums/EnumsManager.java 155 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/core/enums/EnumsShowVo.java 24 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/action/ApiOrderAction.java 12 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/actions/AdminAction.java 10 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/actions/CommonDataAction.java 48 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/bean/OperationLog.java 81 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/bean/reqVO/EnumCodeReqVo.java 15 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/bean/reqVO/OperationLogReqVo.java 77 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/bean/respVO/OperationLogRespVo.java 66 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/dao/OperationLogDao.java 19 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/service/OperationLogService.java 27 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/service/impl/OperationLogServiceImpl.java 85 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/enums/OperationButtonEnum.java 77 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/enums/OperationFunctionEnum.java 64 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/enums/PayMethodEnum.java 55 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/enums/SmsPlatformEnum.java 50 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/enums/SmsTypeEnum.java 53 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/action/OrderController.java 36 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/action/ProjServiceController.java 50 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderService.java 2 ●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java 79 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjServicesServiceImpl.java 81 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hiveErp/action/OperationLogController.java 106 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/config/application.properties 2 ●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/common/OperstionLogDao.xml 68 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/operation-list.html 333 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/core/enums/EnumApiShowAble.java
New file
@@ -0,0 +1,26 @@
package com.matrix.core.enums;
import java.util.List;
/**
 * 通过统一获取key,value的能力
 */
public interface EnumApiShowAble {
    /**
     * 获取枚举的唯一编码
     * @return
     */
    String getEnumCode();
    /**
     * 获取枚举对外展示对象列表
     * @return
     */
    List<EnumsShowVo> getEnumsShowVos();
}
zq-erp/src/main/java/com/matrix/core/enums/EnumsManager.java
New file
@@ -0,0 +1,155 @@
package com.matrix.core.enums;
import com.matrix.core.tools.LogUtil;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class EnumsManager implements ApplicationRunner {
    private final List<String> CLASS_NAME = new ArrayList<>();
    private ClassLoader classLoader;
    private static final String SUFFIX = ".class";
    private Map<String, List<EnumsShowVo>> showAbleMap = new HashMap<>();
    @Override
    public void run(ApplicationArguments args) throws Exception {
        LogUtil.info("扫描自定义枚举------------------");
        initEnum("com.matrix");
        LogUtil.info("扫描自定义枚举结束===============");
    }
    public List<EnumsShowVo> getShowEnum(String emumCode) {
        return showAbleMap.get(emumCode);
    }
    private void initEnum(String... packages) {
        classLoader = Thread.currentThread().getContextClassLoader();
        for (String basePackage : packages) {
            Enumeration<URL> resources = null;
            try {
                resources = classLoader.getResources(basePackage.replaceAll("\\.", "/"));
            } catch (IOException e) {
                return;
            }
            // 扫描当前工程和jar包
            while (resources.hasMoreElements()) {
                URL url = resources.nextElement();
                if ("file".equals(url.getProtocol())) {
                    doFileScan(url.getPath());
                } else if ("jar".equals(url.getProtocol())) {
                    doJarScan(basePackage, url);
                }
            }
        }
        // 初始化枚举数据
        enumValue();
    }
    /**
     * 扫描当前工程对应包下的所有类
     *
     * @param path
     */
    private void doFileScan(String path) {
        String rootPath = classLoader.getResource("").getPath();
        File pathFile = new File(path);
        File[] files = pathFile.listFiles();
        if (files == null || files.length == 0) {
            return;
        }
        for (File file : files) {
            if (file.isDirectory()) {
                String nextPath = path + "/" + file.getName();
                doFileScan(nextPath);
            } else if (file.getName().endsWith(SUFFIX)) {
                if (!path.contains(rootPath)) {
                    return;
                }
                String subStr = path.substring(rootPath.length());
                String className = (subStr + "/" + file.getName().replaceAll(SUFFIX, "")).replaceAll("/", "\\.");
                CLASS_NAME.add(className);
            }
        }
    }
    /**
     * 扫描jar包下对应包下所有类
     *
     * @param basePackage
     * @param baseURL
     */
    public void doJarScan(String basePackage, URL baseURL) {
        basePackage = basePackage.replaceAll("\\.", "/");
        JarFile jarFile;
        try {
            URLConnection urlConnection = baseURL.openConnection();
            JarURLConnection jarUrl = (JarURLConnection) urlConnection;
            jarFile = jarUrl.getJarFile();
        } catch (IOException e) {
            throw new RuntimeException("未找到资源");
        }
        Enumeration<JarEntry> entries = jarFile.entries();
        while (entries.hasMoreElements()) {
            JarEntry entry = entries.nextElement();
            String name = entry.getName();
            if (name.startsWith(basePackage)) {
                if (name.endsWith(SUFFIX)) {
                    String className = name.replaceAll(SUFFIX, "").replaceAll("/", "\\.");
                    CLASS_NAME.add(className);
                }
            }
        }
    }
    public void enumValue() {
        for (String className : CLASS_NAME) {
            Class<?> clazz = null;
            try {
                clazz = classLoader.loadClass(className);
            } catch (ClassNotFoundException e) {
                continue;
            }
            // 判断类是否为枚举类型
            if (!clazz.isEnum()) {
                continue;
            }
            // 判断ApiShowAble是否为类的父类
            if (!EnumApiShowAble.class.isAssignableFrom(clazz)) {
                continue;
            }
            Object[] constants = clazz.getEnumConstants();
            EnumApiShowAble enumApiShowAble = (EnumApiShowAble) constants[0];
            showAbleMap.put(enumApiShowAble.getEnumCode(), enumApiShowAble.getEnumsShowVos());
        }
    }
}
zq-erp/src/main/java/com/matrix/core/enums/EnumsShowVo.java
New file
@@ -0,0 +1,24 @@
package com.matrix.core.enums;
import lombok.Builder;
import lombok.Data;
/**
 * 枚举值展示对象
 */
@Builder
@Data
public class EnumsShowVo {
    /**
     * 展示名称
     */
    private String displayName;
    /**
     * 提交值
     */
    private Integer value;
}
zq-erp/src/main/java/com/matrix/system/app/action/ApiOrderAction.java
@@ -15,7 +15,9 @@
import com.matrix.system.common.bean.SysUsers;
import com.matrix.system.common.tools.DataAuthUtil;
import com.matrix.system.hive.action.util.QueryUtil;
import com.matrix.system.hive.bean.*;
import com.matrix.system.hive.bean.ShoppingGoodsCategory;
import com.matrix.system.hive.bean.SysOrder;
import com.matrix.system.hive.bean.SysShopInfo;
import com.matrix.system.hive.dao.SysShopInfoDao;
import com.matrix.system.hive.plugin.util.CollectionUtils;
import com.matrix.system.hive.pojo.ShoppingCarItem;
@@ -32,7 +34,6 @@
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
@@ -174,13 +175,10 @@
        if (order == null) {
            throw new GlobleException("订单不存在");
        }
        sysOrderService.cancelOrder(orderId);
        return AjaxResult.buildSuccessInstance("取消成功");
        int i = sysOrderService.cancelOrder(orderId);
        if (i > 0) {
            return AjaxResult.buildSuccessInstance("取消成功");
        }
        return AjaxResult.buildFailInstance("取消失败");
    }
}
zq-erp/src/main/java/com/matrix/system/common/actions/AdminAction.java
@@ -477,6 +477,16 @@
    /**
     * 查询所有员工
     */
    @RequestMapping(value = "/allUser")
    public @ResponseBody
    AjaxResult allUser() {
        return new AjaxResult(AjaxResult.STATUS_SUCCESS, sysUsersService.findByRoleName(false, null));
    }
    /**
     * 根据角色名称查询店铺的员工
     */
    @RequestMapping(value = "/getShopStaffByRoleName")
zq-erp/src/main/java/com/matrix/system/common/actions/CommonDataAction.java
New file
@@ -0,0 +1,48 @@
package com.matrix.system.common.actions;
import com.matrix.core.enums.EnumsManager;
import com.matrix.core.enums.EnumsShowVo;
import com.matrix.core.pojo.AjaxResult;
import com.matrix.system.common.bean.reqVO.EnumCodeReqVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * @author 姜友瑶
 * @description 管理员总action
 * @email 935090232@qq.com
 * @date 2016-06-26
 */
@RestController
@RequestMapping(value = "common/data")
public class CommonDataAction {
    @Autowired
    private EnumsManager enumsManager;
    @RequestMapping("/getEnum/{enumCode}")
    public AjaxResult getEnums(@PathVariable String enumCode) throws ClassNotFoundException {
        return AjaxResult.buildSuccessInstance(enumsManager.getShowEnum(enumCode));
    }
    @RequestMapping("/getEnums")
    public AjaxResult getEnums(@RequestBody @Validated EnumCodeReqVo reqVo) throws ClassNotFoundException {
        Map<String,List<EnumsShowVo>> enumsMap=new HashMap<>();
        for (String enumCode : reqVo.getEnumCodes()) {
            List<EnumsShowVo> showEnum = enumsManager.getShowEnum(enumCode);
            enumsMap.put(enumCode,showEnum);
        }
        return AjaxResult.buildSuccessInstance(enumsMap);
    }
}
zq-erp/src/main/java/com/matrix/system/common/bean/OperationLog.java
New file
@@ -0,0 +1,81 @@
package com.matrix.system.common.bean;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Builder;
import lombok.Data;
/**
 * 单据操作日志
 */
@Data
@TableName("sys_operation_log")
@Builder
public class OperationLog {
    /**
     * 主键
     */
    @TableId(value = "id",type = IdType.AUTO)
    private Long  id;
    /**
     *公司id
     */
    private Long  companyId;
    /**
     *门店id
     */
    private Long  shopId;
    /**
     *操作用户id
     */
    private Long  opeUserId;
    /**
     * 会员id
     */
    private Long  vipId;
    /**
     * 操作功能
     */
    private Integer  opeFunction;
    /**
     * 单据按钮
     */
    private Integer  opeBut;
    /**
     * 单据id
     */
    private Long  billId;
    /**
     * 单据号
     */
    private String  billNo;
    /**
     * 操作人ip
     */
    private String  ip;
    /**
     * 操作备注
     */
    private String  note;
    /**
     * 操作时间
     */
    private String  createTime;
}
zq-erp/src/main/java/com/matrix/system/common/bean/reqVO/EnumCodeReqVo.java
New file
@@ -0,0 +1,15 @@
package com.matrix.system.common.bean.reqVO;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import java.util.List;
@Data
public class EnumCodeReqVo {
    /**
     * 枚举编码
     */
    @NotEmpty
    List<String> enumCodes;
}
zq-erp/src/main/java/com/matrix/system/common/bean/reqVO/OperationLogReqVo.java
New file
@@ -0,0 +1,77 @@
package com.matrix.system.common.bean.reqVO;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
public class OperationLogReqVo {
    /**
     *公司id
     */
    private Long  companyId;
    /**
     *门店id
     */
    private Long  shopId;
    /**
     *操作用户id
     */
    private Long  opeUserId;
    /**
     * 会员id
     */
    private String  vipQueryKey;
    /**
     * 操作功能
     */
    private Integer  opeFunction;
    /**
     * 单据按钮
     */
    private Integer  opeBut;
    /**
     * 单据号
     */
    private String  billNo;
    /**
     * 操作人ip
     */
    private String  ip;
    /**
     * 操作备注
     */
    private String  note;
    /**
     * 操作时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm", timezone="GMT+8")
    private Date startTime;
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm", timezone="GMT+8")
    private Date endTime;
    private Integer pageNum = 0;
    private Integer pageSize = 20;
    private String order = "desc";
    /**
     * 排序-根据哪些字段排序 默认'create_time
     */
    private String sort = "create_time";
}
zq-erp/src/main/java/com/matrix/system/common/bean/respVO/OperationLogRespVo.java
New file
@@ -0,0 +1,66 @@
package com.matrix.system.common.bean.respVO;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
public class OperationLogRespVo {
    /**
     * 主键
     */
    private Long  id;
    /**
     *门店名称
     */
    private String  shopName;
    /**
     *操作用户
     */
    private String  opeUser;
    /**
     * 会员
     */
    private String  vipName;
    /**
     * 操作功能
     */
    private Integer  opeFunction;
    private String  opeFunctionLabel;
    /**
     * 单据按钮
     */
    private Integer  opeBut;
    private String  opeButLabel;
    /**
     * 单据号
     */
    private String  billNo;
    /**
     * 操作人ip
     */
    private String  ip;
    /**
     * 操作备注
     */
    private String  note;
    /**
     * 操作时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", timezone="GMT+8")
    private Date createTime;
}
zq-erp/src/main/java/com/matrix/system/common/dao/OperationLogDao.java
New file
@@ -0,0 +1,19 @@
package com.matrix.system.common.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.matrix.system.common.bean.OperationLog;
import com.matrix.system.common.bean.reqVO.OperationLogReqVo;
import com.matrix.system.common.bean.respVO.OperationLogRespVo;
import org.apache.ibatis.annotations.Param;
/**
 * @description 单据操作记录
 * @author jyy
 * @date 2021-03-10 15:22
 */
public interface OperationLogDao extends BaseMapper<OperationLog> {
    Page<OperationLogRespVo> selectPageList(Page<OperationLogReqVo> page,@Param("param")  OperationLogReqVo operationLogReqVo);
}
zq-erp/src/main/java/com/matrix/system/common/service/OperationLogService.java
New file
@@ -0,0 +1,27 @@
package com.matrix.system.common.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.matrix.system.common.bean.OperationLog;
import com.matrix.system.common.bean.reqVO.OperationLogReqVo;
import com.matrix.system.common.bean.respVO.OperationLogRespVo;
import com.matrix.system.enums.OperationButtonEnum;
import com.matrix.system.enums.OperationFunctionEnum;
/**
 * 单据操作日志
 */
public interface OperationLogService extends IService<OperationLog> {
    void saveOperation(Long companyId, Long shopId, Long userId, OperationFunctionEnum operationFunctionEnum, OperationButtonEnum operationButtonEnum,
                       Long billId, String billNo, Long vipId,String note);
    void saveOperation(Long companyId, Long shopId, Long userId, OperationFunctionEnum operationFunctionEnum, OperationButtonEnum operationButtonEnum,
                       Long billId, String billNo, Long vipId);
    void saveOperation(Long companyId, Long shopId, Long suId, OperationFunctionEnum operationFunctionEnum, OperationButtonEnum operationButtonEnum,String note);
    Page<OperationLogRespVo> selectPage(Page<OperationLogReqVo> page, OperationLogReqVo operationLogReqVo);
}
zq-erp/src/main/java/com/matrix/system/common/service/impl/OperationLogServiceImpl.java
New file
@@ -0,0 +1,85 @@
package com.matrix.system.common.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.matrix.core.tools.WebUtil;
import com.matrix.system.common.bean.OperationLog;
import com.matrix.system.common.bean.reqVO.OperationLogReqVo;
import com.matrix.system.common.bean.respVO.OperationLogRespVo;
import com.matrix.system.common.dao.OperationLogDao;
import com.matrix.system.common.service.OperationLogService;
import com.matrix.system.enums.OperationButtonEnum;
import com.matrix.system.enums.OperationFunctionEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * 单据操作日志
 */
@Service
public class OperationLogServiceImpl extends ServiceImpl<OperationLogDao, OperationLog> implements OperationLogService {
    @Autowired
    OperationLogDao operationLogDao;
    @Override
    public void saveOperation(Long companyId, Long shopId, Long userId, OperationFunctionEnum operationFunctionEnum, OperationButtonEnum operationButtonEnum,
                              Long billId, String billNo, Long vipId, String note) {
        save(OperationLog.builder()
                .companyId(companyId)
                .shopId(shopId)
                .opeUserId(userId)
                .opeFunction(operationFunctionEnum.getValue())
                .opeBut(operationButtonEnum.getValue())
                .billId(billId)
                .billNo(billNo)
                .vipId(vipId)
                .note(note)
                .ip(WebUtil.getCustomerIp()).build());
    }
    @Override
    public void saveOperation(Long companyId, Long shopId, Long userId, OperationFunctionEnum operationFunctionEnum, OperationButtonEnum operationButtonEnum,
                              Long billId, String billNo, Long vipId) {
        save(OperationLog.builder()
                .companyId(companyId)
                .shopId(shopId)
                .opeUserId(userId)
                .opeFunction(operationFunctionEnum.getValue())
                .opeBut(operationButtonEnum.getValue())
                .billId(billId)
                .billNo(billNo)
                .vipId(vipId)
                .ip(WebUtil.getCustomerIp()).build());
    }
    @Override
    public void saveOperation(Long companyId, Long shopId, Long userId, OperationFunctionEnum operationFunctionEnum, OperationButtonEnum operationButtonEnum
            , String note) {
        save(OperationLog.builder()
                .companyId(companyId)
                .shopId(shopId)
                .opeUserId(userId)
                .opeFunction(operationFunctionEnum.getValue())
                .opeBut(operationButtonEnum.getValue())
                .note(note)
                .ip(WebUtil.getCustomerIp()).build());
    }
    @Override
    public Page<OperationLogRespVo> selectPage(Page<OperationLogReqVo> page, OperationLogReqVo operationLogReqVo) {
        Page<OperationLogRespVo> voPage=operationLogDao.selectPageList(page, operationLogReqVo);
        voPage.getRecords().stream().forEach(e->{
            e.setOpeFunctionLabel(OperationFunctionEnum.getByValue(e.getOpeFunction()));
            e.setOpeButLabel(OperationButtonEnum.getByValue(e.getOpeBut()));
        });
        return voPage;
    }
}
zq-erp/src/main/java/com/matrix/system/enums/OperationButtonEnum.java
New file
@@ -0,0 +1,77 @@
package com.matrix.system.enums;
import com.google.common.collect.Lists;
import com.matrix.core.enums.EnumApiShowAble;
import com.matrix.core.enums.EnumsShowVo;
import com.matrix.core.exception.GlobleException;
import java.util.List;
import java.util.stream.Collectors;
/**
 * 操作按钮枚举
 * @author jyy
 */
public enum OperationButtonEnum implements EnumApiShowAble {
    CREATE(1, "新增"),
    UPDATE(2, "修改"),
    DELETE(3, "删除"),
    CANCEL(4, "取消"),
    INVALID(5, "设置为无效"),
    EFFECTIVE(6, "设置为有效"),
    ORDER_SK(7, "订单收款"),
    ORDER_TK(8, "订单退款"),
    ORDER_UPDATE_TIME(9, "更新订单时间"),
    EXPORT(10, "导出"),
    SERVICE_ORDER_BEGIN(11, "开始服务单"),
    SERVICE_ORDER_END(12, "完成服务单"),
    SERVICE_ORDER_PL(13, "服务单配料"),
    SERVICE_ORDER_HK(14, "划扣"),
    SERVICE_ORDER_PB(15, "排班"),
    SERVICE_ORDER_QRYY(16, "确认预约"),
    ;
    private Integer value;
    private String displayName;
    OperationButtonEnum(Integer value, String displayName) {
        this.value = value;
        this.displayName = displayName;
    }
    public static String getByValue(Integer value) {
        for (int i = 0; i < values().length; i++) {
            if (value.equals(values()[i].getValue())) {
                return values()[i].displayName;
            }
        }
        throw new GlobleException("无效枚举值");
    }
    @Override
    public String getEnumCode() {
        return "operationButton";
    }
    @Override
    public List<EnumsShowVo> getEnumsShowVos() {
        return Lists.newArrayList(values()).stream().map(item ->
                EnumsShowVo.builder()
                        .displayName(item.getDisplayName())
                        .value(item.value)
                        .build()
        ).collect(Collectors.toList());
    }
    public Integer getValue() {
        return value;
    }
    public String getDisplayName() {
        return displayName;
    }
}
zq-erp/src/main/java/com/matrix/system/enums/OperationFunctionEnum.java
New file
@@ -0,0 +1,64 @@
package com.matrix.system.enums;
import com.google.common.collect.Lists;
import com.matrix.core.enums.EnumApiShowAble;
import com.matrix.core.enums.EnumsShowVo;
import com.matrix.core.exception.GlobleException;
import java.util.List;
import java.util.stream.Collectors;
/**
 * 操作功能枚举
 *
 * @author jyy
 */
public enum OperationFunctionEnum implements EnumApiShowAble {
    ORDER(1, "订单"),
    SERVICE_ORDER(2, "服务单"),
    ;
    private Integer value;
    private String displayName;
    OperationFunctionEnum(Integer value, String displayName) {
        this.value = value;
        this.displayName = displayName;
    }
    @Override
    public String getEnumCode() {
        return "operationFunction";
    }
    @Override
    public List<EnumsShowVo> getEnumsShowVos() {
        return Lists.newArrayList(values()).stream().map(item ->
                EnumsShowVo.builder()
                        .displayName(item.getDisplayName())
                        .value(item.value)
                        .build()
        ).collect(Collectors.toList());
    }
    public static String getByValue(Integer value) {
        for (int i = 0; i < values().length; i++) {
            if (value.equals(values()[i].getValue())) {
                return values()[i].displayName;
            }
        }
        throw new GlobleException("无效枚举值");
    }
    public Integer getValue() {
        return value;
    }
    public String getDisplayName() {
        return displayName;
    }
}
zq-erp/src/main/java/com/matrix/system/enums/PayMethodEnum.java
New file
@@ -0,0 +1,55 @@
package com.matrix.system.enums;
import com.google.common.collect.Lists;
import com.matrix.core.enums.EnumApiShowAble;
import com.matrix.core.enums.EnumsShowVo;
import java.util.List;
import java.util.stream.Collectors;
/**
 * 支付方式
 * @author jyy
 */
public enum PayMethodEnum implements EnumApiShowAble {
    CASH(1, "现金"),
    WECHAT(2, "微信"),
    ALIPAY(3, "支付宝"),
    BANK_CARD(4, "银行卡"),
    BANK_MT(5, "美团"),
    VIP_CARD(6, "会员卡");
    private Integer value;
    private String displayName;
    PayMethodEnum(Integer value, String displayName) {
        this.value = value;
        this.displayName = displayName;
    }
    @Override
    public String getEnumCode() {
        return "payMethod";
    }
    @Override
    public List<EnumsShowVo> getEnumsShowVos() {
        return Lists.newArrayList(values()).stream().map(item ->
                EnumsShowVo.builder()
                        .displayName(item.getDisplayName())
                        .value(item.value)
                        .build()
        ).collect(Collectors.toList());
    }
    public Integer getValue() {
        return value;
    }
    public String getDisplayName() {
        return displayName;
    }
}
zq-erp/src/main/java/com/matrix/system/enums/SmsPlatformEnum.java
New file
@@ -0,0 +1,50 @@
package com.matrix.system.enums;
import com.google.common.collect.Lists;
import com.matrix.core.enums.EnumApiShowAble;
import com.matrix.core.enums.EnumsShowVo;
import java.util.List;
import java.util.stream.Collectors;
public enum SmsPlatformEnum implements EnumApiShowAble {
    ALIBABA(1 ,"阿里云短信"),
    HUYIWUXIAN(2, "互亿无线");
    private  Integer value;
    private  String displayName;
    SmsPlatformEnum(Integer value, String displayName) {
        this.value = value;
        this.displayName = displayName;
    }
    @Override
    public String getEnumCode() {
        return "smsPlatform";
    }
    @Override
    public List<EnumsShowVo> getEnumsShowVos() {
        return Lists.newArrayList(values()).stream().map(item ->
                EnumsShowVo.builder()
                        .displayName(item.getDisplayName())
                        .value(item.value)
                        .build()
        ).collect(Collectors.toList());
    }
    public Integer getValue() {
        return value;
    }
    public String getDisplayName() {
        return displayName;
    }
}
zq-erp/src/main/java/com/matrix/system/enums/SmsTypeEnum.java
New file
@@ -0,0 +1,53 @@
package com.matrix.system.enums;
import com.google.common.collect.Lists;
import com.matrix.core.enums.EnumApiShowAble;
import com.matrix.core.enums.EnumsShowVo;
import java.util.List;
import java.util.stream.Collectors;
/**
 * 短信类型
 */
public enum SmsTypeEnum implements EnumApiShowAble {
    VERIFY_CODE(1, "验证码"),
    SMS_NOTICE(2, "短信通知"),
    PROMOTE(3, "推广短信");
    private  Integer value;
    private  String displayName;
    SmsTypeEnum(Integer value, String displayName) {
        this.value = value;
        this.displayName = displayName;
    }
    @Override
    public String getEnumCode() {
        return "smsType";
    }
    @Override
    public List<EnumsShowVo> getEnumsShowVos() {
        return Lists.newArrayList(values()).stream().map(item ->
                EnumsShowVo.builder()
                        .displayName(item.getDisplayName())
                        .value(item.value)
                        .build()
        ).collect(Collectors.toList());
    }
    public Integer getValue() {
        return value;
    }
    public String getDisplayName() {
        return displayName;
    }
}
zq-erp/src/main/java/com/matrix/system/hive/action/OrderController.java
@@ -1,9 +1,8 @@
package com.matrix.system.hive.action;
import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSON;
import com.matrix.component.asyncmessage.AsyncMessageManager;
import com.matrix.component.rabbitmq.RabiitMqTemplate;
import com.matrix.core.constance.MatrixConstance;
import com.matrix.core.exception.GlobleException;
import com.matrix.core.pojo.AjaxResult;
import com.matrix.core.pojo.PaginationVO;
@@ -18,9 +17,12 @@
import com.matrix.system.common.constance.AppConstance;
import com.matrix.system.common.dao.BusParameterSettingsDao;
import com.matrix.system.common.dao.SysCompanyDao;
import com.matrix.system.common.service.OperationLogService;
import com.matrix.system.common.tools.DataAuthUtil;
import com.matrix.system.common.tools.ResponseHeadUtil;
import com.matrix.system.constance.Dictionary;
import com.matrix.system.enums.OperationButtonEnum;
import com.matrix.system.enums.OperationFunctionEnum;
import com.matrix.system.hive.bean.*;
import com.matrix.system.hive.dao.*;
import com.matrix.system.hive.plugin.util.CollectionUtils;
@@ -28,7 +30,6 @@
import com.matrix.system.shopXcx.mqTask.AsyncMessageRouting;
import com.matrix.system.wechart.templateMsg.UniformMsgParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.ModelMap;
@@ -106,8 +107,10 @@
    @Autowired
    private AsyncMessageManager asyncMessageManager;
    @Value("${evn}")
    private String evn;
    @Autowired
    private OperationLogService operationLogService;
    /**
     * 计算订单金额
@@ -233,7 +236,7 @@
    SysCompanyDao companyDao;
    /**
     * 收款
     * 打印订单
     */
    @RequestMapping(value = "/printOrder")
    public @ResponseBody
@@ -266,6 +269,7 @@
     */
    @RequestMapping(value = "/updateOrderTime")
    public @ResponseBody
    @Transactional(rollbackFor = Exception.class)
    AjaxResult updateOrderTime(SysOrder sysOrder) {
        sysOrderDao.updateOrderTime(sysOrder.getPayTime(), sysOrder.getId());
@@ -278,6 +282,15 @@
        //更新收款流水时间
        sysOrderFlowDao.updateTimeByOrderId(sysOrder.getId(), sysOrder.getPayTime());
        //保存单据日志
        sysOrder= sysOrderDao.selectById(sysOrder.getId());
        operationLogService.saveOperation(sysOrder.getCompanyId(), sysOrder.getShopId(),getMe().getSuId(),
                OperationFunctionEnum.ORDER,
                OperationButtonEnum.ORDER_UPDATE_TIME,
                sysOrder.getId(),
                sysOrder.getOrderNo(),
                sysOrder.getVipId(),
                "更新参数: "+JSON.toJSONString(sysOrder));
        return new AjaxResult(AjaxResult.STATUS_SUCCESS, "修改成功");
    }
@@ -505,8 +518,7 @@
    @RequestMapping(value = "/exportExcel")
    public void report(ModelMap model, HttpServletRequest request, HttpServletResponse response,
                       SysOrder sysOrder) throws Exception {
        SysUsers sysUsers = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
        sysOrder.setShopId(sysUsers.getShopId());
        sysOrder.setShopId(getMe().getShopId());
        doExportOrder(response, sysOrder);
        return;
@@ -519,6 +531,7 @@
    public void erpExportExcel(ModelMap model, HttpServletRequest request, HttpServletResponse response,
                               SysOrder sysOrder) throws Exception {
        doExportOrder(response, sysOrder);
        return;
    }
@@ -532,6 +545,13 @@
     * @throws IOException
     */
    private void doExportOrder(HttpServletResponse response, SysOrder sysOrder) throws IOException {
        //保存单据日志
        operationLogService.saveOperation(getMe().getCompanyId(), getMe().getShopId(),getMe().getSuId(),
                OperationFunctionEnum.ORDER,
                OperationButtonEnum.EXPORT,
                String.format("导出参数:%s" , JSON.toJSONString(sysOrder)));
        List<ExcelSheetPO> res = new ArrayList<>();
        ExcelSheetPO orderSheet = new ExcelSheetPO();
        String title = "订单记录";
zq-erp/src/main/java/com/matrix/system/hive/action/ProjServiceController.java
@@ -3,6 +3,7 @@
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.matrix.core.anotations.RemoveRequestToken;
import com.matrix.core.constance.MatrixConstance;
import com.matrix.core.exception.GlobleException;
@@ -15,16 +16,18 @@
import com.matrix.core.tools.excl.ExcelSheetPO;
import com.matrix.core.tools.excl.ExcelUtil;
import com.matrix.core.tools.excl.ExcelVersion;
import com.matrix.system.app.dto.IdSubmitDto;
import com.matrix.system.common.bean.BusParameterSettings;
import com.matrix.system.common.bean.SysUsers;
import com.matrix.system.common.constance.AppConstance;
import com.matrix.system.common.dao.BusParameterSettingsDao;
import com.matrix.system.common.dao.SysCompanyDao;
import com.matrix.system.common.service.OperationLogService;
import com.matrix.system.common.service.SysUsersService;
import com.matrix.system.common.tools.DataAuthUtil;
import com.matrix.system.common.tools.ResponseHeadUtil;
import com.matrix.system.constance.Dictionary;
import com.matrix.system.enums.OperationButtonEnum;
import com.matrix.system.enums.OperationFunctionEnum;
import com.matrix.system.hive.action.util.QueryUtil;
import com.matrix.system.hive.bean.*;
import com.matrix.system.hive.dao.*;
@@ -35,8 +38,8 @@
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
@@ -108,6 +111,10 @@
    @Autowired
    SysShopInfoDao shopInfoDao;
    @Autowired
    private OperationLogService operationLogService;
    /**
     * 根据id查询服务单信息
@@ -464,6 +471,7 @@
     */
    @RequestMapping(value = "/updateOrderTime")
    public @ResponseBody
    @Transactional(rollbackFor = Exception.class)
    AjaxResult updateOrderTime(@RequestBody  ServiceOrderTimeDto serviceOrderTimeDto) {
        sysProjServicesDao.updateOrderTime(serviceOrderTimeDto);
        // 更新业绩时间
@@ -471,6 +479,15 @@
        achieveNew.setServiceOrderId(serviceOrderTimeDto.getId());
        achieveNew.setDatatime(serviceOrderTimeDto.getConsumeTime());
        achieveNewService.modifyAchieveTime(achieveNew);
        SysProjServices projServices = sysProjServicesDao.selectById(serviceOrderTimeDto.getId());
        //保存单据日志
        operationLogService.saveOperation(projServices.getCompanyId(), projServices.getShopId(),getMe().getSuId(),
                OperationFunctionEnum.SERVICE_ORDER,
                OperationButtonEnum.ORDER_UPDATE_TIME,
                projServices.getId(),
                projServices.getServiceNo(),
                projServices.getVipId(),
                "更新参数: "+JSON.toJSONString(serviceOrderTimeDto));
        return new AjaxResult(AjaxResult.STATUS_SUCCESS, "修改成功");
    }
@@ -515,20 +532,7 @@
        return mv;
    }
    /**
     * 根据id对服务单进行派单
     */
    @RequestMapping(value = "/paidan")
    public @ResponseBody
    AjaxResult paidan(Long id) {
        SysProjServices services = sysProjServicesService.findById(id);
        int i = sysProjServicesService.modifyPDProjServices(services);
        if (i > 0) {
            return new AjaxResult(AjaxResult.STATUS_SUCCESS, "派单成功");
        } else {
            return new AjaxResult(AjaxResult.STATUS_FAIL, "派单失败");
        }
    }
    @Autowired
    BusParameterSettingsDao busParameterSettingsDao;
@@ -660,12 +664,6 @@
    }
    @RequestMapping(value = "/addServiceProj")
    @ResponseBody
    public AjaxResult addServiceProj(SysProjServices sysProjServices) {
        return AjaxResult.buildSuccessInstance("保存成功");
    }
    /**
     * 删除服务单项目/套餐
@@ -725,6 +723,14 @@
    private void doExportServiceOrder(HttpServletResponse response, SysProjServices projServices) throws IOException {
        //保存单据日志
        operationLogService.saveOperation(getMe().getCompanyId(), getMe().getShopId(),getMe().getSuId(),
                OperationFunctionEnum.SERVICE_ORDER,
                OperationButtonEnum.EXPORT,
                String.format("导出参数:%s" , JSON.toJSONString(projServices)));
        List<ExcelSheetPO> res = new ArrayList<>();
        ExcelSheetPO orderSheet = new ExcelSheetPO();
        String title = "服务订单明细";
zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderService.java
@@ -39,7 +39,7 @@
     */
    public int remove(List<Long> list);
    public int cancelOrder(Long id);
    public void cancelOrder(Long id);
    /**
     * 根据id删除SysOrder
     *
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java
@@ -20,7 +20,10 @@
import com.matrix.system.common.constance.AppConstance;
import com.matrix.system.common.dao.BusParameterSettingsDao;
import com.matrix.system.common.dao.SysUsersDao;
import com.matrix.system.common.service.OperationLogService;
import com.matrix.system.constance.Dictionary;
import com.matrix.system.enums.OperationButtonEnum;
import com.matrix.system.enums.OperationFunctionEnum;
import com.matrix.system.hive.bean.*;
import com.matrix.system.hive.dao.*;
import com.matrix.system.hive.plugin.util.CollectionUtils;
@@ -126,6 +129,9 @@
    @Autowired
    private AsyncMessageManager asyncMessageManager;
    @Autowired
    private OperationLogService operationLogService;
    @Override
    public int add(SysOrder sysOrder) {
@@ -184,6 +190,7 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public SysOrder checkAndSaveOrder(SysOrder sysOrder) {
        // 计算订单折扣金额,收款情况下 计算订单总额
@@ -233,12 +240,27 @@
            //新增订单
            sysOrder.setOrderNo(codeService.getOrderCode());
            sysOrderDao.insert(sysOrder);
            //保存单据日志
            operationLogService.saveOperation(sysOrder.getCompanyId(), sysOrder.getShopId(), user.getSuId(),
                    OperationFunctionEnum.ORDER,
                    OperationButtonEnum.CREATE,
                    sysOrder.getId(),
                    sysOrder.getOrderNo(),
                    sysOrder.getVipId());
        } else {
            //更新订单
            sysOrderDao.update(sysOrder);
            //删除原有订单明细
            orderItemDao.deleteByOrderId(sysOrder.getId());
            //保存单据日志
            operationLogService.saveOperation(sysOrder.getCompanyId(), sysOrder.getShopId(), user.getSuId(),
                    OperationFunctionEnum.ORDER,
                    OperationButtonEnum.UPDATE,
                    sysOrder.getId(),
                    sysOrder.getOrderNo(),
                    sysOrder.getVipId(),
                    "修改订单内容");
        }
        sysOrder.getItems().forEach(sysOrderItem -> {
@@ -266,9 +288,10 @@
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int cancelOrder(Long id) {
    public void cancelOrder(Long id) {
        SysOrder order = sysOrderDao.selectById(id);
        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        if (order.getStatu().equals(Dictionary.ORDER_STATU_DFK)) {
            order.setStatu(Dictionary.ORDER_STATU_YQX);
@@ -277,10 +300,17 @@
            //发送微信公众号提醒
            UniformMsgParam uniformMsgParam = new UniformMsgParam(order.getCompanyId(), UniformMsgParam.GZH_DDQX);
            uniformMsgParam.put("orderId", order.getId());
            asyncMessageManager.sendMsg(AsyncMessageRouting.SEND_UNIFORM_TEMPLATE_MSG ,uniformMsgParam);
            asyncMessageManager.sendMsg(AsyncMessageRouting.SEND_UNIFORM_TEMPLATE_MSG, uniformMsgParam);
            return sysOrderDao.update(order);
            sysOrderDao.update(order);
            //保存单据日志
            operationLogService.saveOperation(order.getCompanyId(), order.getShopId(),sysUsers.getSuId(),
                    OperationFunctionEnum.ORDER,
                    OperationButtonEnum.CANCEL,
                    order.getId(),
                    order.getOrderNo(),
                    order.getVipId(),
                    "未付款取消订单");
        } else {
            //一个订单只能被取消一次
@@ -377,8 +407,18 @@
            // 取消订单
            order.setStatu(Dictionary.ORDER_STATU_YQX);
            return sysOrderDao.update(order);
            sysOrderDao.update(order);
            //保存单据日志
            operationLogService.saveOperation(order.getCompanyId(), order.getShopId(),sysUsers.getSuId(),
                    OperationFunctionEnum.ORDER,
                    OperationButtonEnum.CANCEL,
                    order.getId(),
                    order.getOrderNo(),
                    order.getVipId(),
                    "已付款取消订单");
        }
    }
@@ -512,10 +552,12 @@
        //设置会员积分
        addVipScore(pageOrder);
    }
    /**
     * 付款后更新订单信息
     *
     * @param pageOrder
     */
    private void updateOrderInfo(SysOrder pageOrder) {
@@ -542,12 +584,20 @@
        double sum = flows.stream().mapToDouble(item -> item.getAmount().doubleValue()).sum();
        if(sum>0 && cardPayAmount.doubleValue()==0 && cashPayAmount.doubleValue()==0 ){
        if (sum > 0 && cardPayAmount.doubleValue() == 0 && cashPayAmount.doubleValue() == 0) {
            throw new GlobleException("订单更新失败,支付金额计算错误,请联系管理员");
        }
        sysOrderDao.update(pageOrder);
        //保存单据日志
        operationLogService.saveOperation(pageOrder.getCompanyId(), pageOrder.getShopId(), user.getSuId(),
                OperationFunctionEnum.ORDER,
                OperationButtonEnum.ORDER_SK,
                pageOrder.getId(),
                pageOrder.getOrderNo(),
                pageOrder.getVipId());
    }
    private void checkOrder(SysOrder pageOrder) {
@@ -579,7 +629,7 @@
            entries.forEach(entrie -> {
                double sum = entrie.getValue().stream().mapToDouble(AchieveNew::getGoodsCash).sum();
                //todo 目前使用js计算金额可能存在精度的误差展示用0.1屏蔽
                if (Math.abs(sum- (item.getZkPrice()*item.getCount()) )>0.1) {
                if (Math.abs(sum - (item.getZkPrice() * item.getCount())) > 0.1) {
                    ShoppingGoods shopGoods = shoppingGoodsDao.selectById(item.getGoodsId());
                    throw GlobleException.instance(shopGoods.getName() + "," + entrie.getKey() + "业绩金额与收款金额不一致");
                }
@@ -995,7 +1045,7 @@
     * @date 2016年9月19日
     */
    public void addMoneyCardUse(SysOrder sourceOrder) {
        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        List<SysOrderItem> orderItemList = sourceOrder.getItems();
        for (SysOrderItem sysOrderItem : orderItemList) {
            // 如果购买的是充值卡
@@ -1034,6 +1084,7 @@
                    moneyCardUse.setFailTime(invalidTime);
                    moneyCardUseDao.insert(moneyCardUse);
                }
            }
        }
@@ -1414,9 +1465,9 @@
            boolean zsConsumeAchieve = projServicesService.skipServiceOrderStep(Dictionary.ZS_CONSUME_ACHIEVE);
            if (zsConsumeAchieve) {
                //赠送情况下,如果收款金额大于0,就是赠送金额划扣的情况,金额即为划扣的折扣金额
                if(sysOrderItem.getZkPrice()>0){
                if (sysOrderItem.getZkPrice() > 0) {
                    puse.setPrice(sysOrderItem.getZkPrice());
                }else{
                } else {
                    puse.setPrice(sysOrderItem.getShoppingGoods().getSealPice());
                }
            } else {
@@ -1640,6 +1691,14 @@
        // 设置业绩
        achieveNewService.addAchaeveByOrder(sysOrder);
        //保存单据日志
        operationLogService.saveOperation(sysOrder.getCompanyId(), sysOrder.getShopId(), user.getSuId(),
                OperationFunctionEnum.ORDER,
                OperationButtonEnum.ORDER_TK,
                sysOrder.getId(),
                sysOrder.getOrderNo(),
                sysOrder.getVipId());
    }
    private void addRefundOrderFlow(SysOrder sourceOrder) {
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjServicesServiceImpl.java
@@ -19,7 +19,10 @@
import com.matrix.system.common.dao.BusParameterSettingsDao;
import com.matrix.system.common.dao.SysUsersDao;
import com.matrix.system.common.service.BusParameterSettingService;
import com.matrix.system.common.service.OperationLogService;
import com.matrix.system.constance.Dictionary;
import com.matrix.system.enums.OperationButtonEnum;
import com.matrix.system.enums.OperationFunctionEnum;
import com.matrix.system.hive.bean.*;
import com.matrix.system.hive.dao.*;
import com.matrix.system.hive.plugin.util.MoneyUtil;
@@ -61,7 +64,8 @@
    @Autowired
    private SysProjUseDao sysProjUseDao;
    @Autowired
    private OperationLogService operationLogService;
    @Autowired
    private SysOutStoreDao sysOutStoreDao;
@@ -141,10 +145,10 @@
    @Transactional(rollbackFor = Exception.class)
    @Override
    public SysProjServices addSysProjServices(SysProjServices sysProjServices) throws GlobleException {
        SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
        //创建服务单
        if (WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY) != null) {
            SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
            sysProjServices.setCreateStaffId(user.getSuId());
            sysProjServices.setShopId(user.getShopId());
            sysProjServices.setCompanyId(user.getCompanyId());
@@ -249,6 +253,15 @@
        sysProjServices.setTotalTime(totalTime);
        sysProjServices.setMoney(new BigDecimal(hkPrice).setScale(2, BigDecimal.ROUND_HALF_DOWN).doubleValue());
        sysProjServicesDao.update(sysProjServices);
        //保存单据日志
        operationLogService.saveOperation(sysProjServices.getCompanyId(), sysProjServices.getShopId(),user.getSuId(),
                OperationFunctionEnum.SERVICE_ORDER,
                OperationButtonEnum.CREATE,
                sysProjServices.getId(),
                sysProjServices.getServiceNo(),
                sysProjServices.getVipId());
        return sysProjServices;
    }
@@ -464,6 +477,14 @@
            autoBatching(projServices);
        }
        SysUsers users = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        //保存单据日志
        operationLogService.saveOperation(checkProjServices.getCompanyId(), checkProjServices.getShopId(),users.getSuId(),
                OperationFunctionEnum.SERVICE_ORDER,
                OperationButtonEnum.SERVICE_ORDER_PB,
                checkProjServices.getId(),
                checkProjServices.getServiceNo(),
                checkProjServices.getVipId());
        return i;
    }
@@ -567,6 +588,16 @@
        }
        //删除积分
        scoreVipDetailService.removeByBusinessId(checkProjServices.getVipId(), checkProjServices.getId());
        SysUsers users = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        //保存单据日志
        operationLogService.saveOperation(checkProjServices.getCompanyId(), checkProjServices.getShopId(),users.getSuId(),
                OperationFunctionEnum.SERVICE_ORDER,
                OperationButtonEnum.CANCEL,
                checkProjServices.getId(),
                checkProjServices.getServiceNo(),
                checkProjServices.getVipId());
        //更新服务单状态
        return sysProjServicesDao.update(checkProjServices);
@@ -722,6 +753,14 @@
            asyncMessageManager.sendMsg(AsyncMessageRouting.SEND_UNIFORM_TEMPLATE_MSG, uniformMsgParam);
            //发送划扣短信提醒
            taiYanAliyunSmsService.sendHkNotice(projServices);
            //保存单据日志
            operationLogService.saveOperation(projServices.getCompanyId(), projServices.getShopId(),users.getSuId(),
                    OperationFunctionEnum.SERVICE_ORDER,
                    OperationButtonEnum.SERVICE_ORDER_HK,
                    projServices.getId(),
                    projServices.getServiceNo(),
                    projServices.getVipId());
            return result;
        }
@@ -964,6 +1003,15 @@
//        // 判断是服务超时还是服务提前结束,如果minspace大于0则是超时服务,小于0则是提前结束服务
//        projServices.setIsOverTime(minspace + "");
//        projServices.setState(Dictionary.SERVICE_STATU_FWWC);
        //保存单据日志
        operationLogService.saveOperation(projServices.getCompanyId(), projServices.getShopId(),sysUsers.getSuId(),
                OperationFunctionEnum.SERVICE_ORDER,
                OperationButtonEnum.SERVICE_ORDER_PL,
                projServices.getId(),
                projServices.getServiceNo(),
                projServices.getVipId());
        return sysProjServicesDao.update(projServices);
    }
@@ -1020,6 +1068,14 @@
        // 设置美疗师实际开始时间
        checkBeauticianState.setState(Dictionary.BEATUI_STATE_SYZ);
        projServices.getVipId();
        //保存单据日志
        operationLogService.saveOperation(projServices.getCompanyId(), projServices.getShopId(),users.getSuId(),
                OperationFunctionEnum.SERVICE_ORDER,
                OperationButtonEnum.SERVICE_ORDER_BEGIN,
                projServices.getId(),
                projServices.getServiceNo(),
                projServices.getVipId());
        return beauticianStateDao.update(checkBeauticianState);
    }
@@ -1062,7 +1118,13 @@
            checkprojServices.setState(Dictionary.SERVICE_STATU_FWWC);
            sysProjServicesDao.update(checkprojServices);
        }
        //保存单据日志
        operationLogService.saveOperation(projServices.getCompanyId(), projServices.getShopId(),users.getSuId(),
                OperationFunctionEnum.SERVICE_ORDER,
                OperationButtonEnum.SERVICE_ORDER_END,
                projServices.getId(),
                projServices.getServiceNo(),
                projServices.getVipId());
        return rerunlt;
    }
@@ -1114,11 +1176,22 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int confirmServiceOrder(Long id) {
        SysUsers users = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
        SysProjServices services = new SysProjServices();
        services.setId(id);
        services.setState(Dictionary.BEATUI_STATE_DYY);
        int i = modify(services);
        SysProjServices projServices =findById(id);
         //保存单据日志
        operationLogService.saveOperation(projServices.getCompanyId(), projServices.getShopId(),users.getSuId(),
                OperationFunctionEnum.SERVICE_ORDER,
                OperationButtonEnum.SERVICE_ORDER_QRYY,
                projServices.getId(),
                projServices.getServiceNo(),
                projServices.getVipId());
        if (i > 0) {
            //发送微信公众号提醒
            services = findById(services.getId());
zq-erp/src/main/java/com/matrix/system/hiveErp/action/OperationLogController.java
New file
@@ -0,0 +1,106 @@
package com.matrix.system.hiveErp.action;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.matrix.core.pojo.AjaxResult;
import com.matrix.core.tools.DateUtil;
import com.matrix.core.tools.excl.ExcelSheetPO;
import com.matrix.core.tools.excl.ExcelUtil;
import com.matrix.core.tools.excl.ExcelVersion;
import com.matrix.system.common.bean.reqVO.OperationLogReqVo;
import com.matrix.system.common.bean.respVO.OperationLogRespVo;
import com.matrix.system.common.service.OperationLogService;
import com.matrix.system.common.tools.ResponseHeadUtil;
import com.matrix.system.hive.action.util.QueryUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping(value = "admin/operation")
public class OperationLogController {
    @Autowired
    private OperationLogService operationLogService;
    /**
     * 查询单据操作记录
     *
     * @param operationLogReqVo
     * @return
     */
    @PostMapping(value = "/getOperation")
    public
    AjaxResult getOperation(@RequestBody OperationLogReqVo operationLogReqVo) {
        QueryUtil.setQueryLimitCom(operationLogReqVo);
        Page<OperationLogReqVo> page = new Page<>(operationLogReqVo.getPageNum(),operationLogReqVo.getPageSize());
        Page<OperationLogRespVo> pageResult = operationLogService.selectPage(page,operationLogReqVo);
        return AjaxResult.buildSuccessInstance(pageResult.getRecords(),pageResult.getTotal());
    }
    /**
     * 导出操作记录
     */
    @RequestMapping(value = "/exportExcel")
    public void exportExcel(ModelMap model, HttpServletRequest request, HttpServletResponse response,OperationLogReqVo operationLogReqVo) throws Exception {
        doExportExcel(response, operationLogReqVo);
    }
    private void doExportExcel(HttpServletResponse response, OperationLogReqVo operationLogReqVo) throws IOException {
        List<ExcelSheetPO> res = new ArrayList<>();
        ExcelSheetPO orderSheet = new ExcelSheetPO();
        String title = "系统操作记录";
        orderSheet.setSheetName(title);
        orderSheet.setTitle(title);
        String[] header = {"门店","操作用户", "操作时间", "操作功能","操作按钮", "单据号","操作会员","备注","IP地址"};
        orderSheet.setHeaders(header);
        QueryUtil.setQueryLimitCom(operationLogReqVo);
        Page<OperationLogReqVo> page = new Page<>(operationLogReqVo.getPageNum(),operationLogReqVo.getPageSize());
        Page<OperationLogRespVo> pageResult = operationLogService.selectPage(page,operationLogReqVo);
        List<List<Object>> list = new ArrayList<>();
        if (pageResult.getRecords().size() > 0) {
            for (OperationLogRespVo item : pageResult.getRecords()) {
                List<Object> temp = new ArrayList<>();
                temp.add(item.getShopName());
                temp.add(item.getOpeUser());
                temp.add(DateUtil.dateToString(item.getCreateTime(), DateUtil.DATE_FORMAT_MM));
                temp.add(item.getOpeFunctionLabel());
                temp.add(item.getOpeButLabel());
                temp.add(item.getBillNo());
                temp.add(item.getVipName());
                temp.add(item.getNote());
                temp.add(item.getIp());
                list.add(temp);
            }
        }
        orderSheet.setDataList(list);
        res.add(orderSheet);
        response = ResponseHeadUtil.setExcelHead(response);
        response.setHeader("Content-Disposition",
                "attachment;filename=" + URLEncoder.encode(title + DateUtil.getTimeMark() + ".xlsx".trim(), "UTF-8"));
        OutputStream os = response.getOutputStream();
        ExcelUtil.createWorkbookAtOutStream(ExcelVersion.V2007, res, os, true);
    }
}
zq-erp/src/main/resources/config/application.properties
@@ -1,5 +1,5 @@
spring.profiles.active=meidu
spring.profiles.active=test
evn=dev
server.port=8080
zq-erp/src/main/resources/mybatis/mapper/common/OperstionLogDao.xml
New file
@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.matrix.system.common.dao.OperationLogDao">
    <select id="selectPageList" resultType="com.matrix.system.common.bean.respVO.OperationLogRespVo">
        SELECT
        a.id,
        a.ope_function,
        a.ope_but,
        d.shop_short_name as shop_name,
        b.su_name AS opeUser,
        c.vip_name,
        a.bill_no,
        a.ip,
        a.note,
        a.create_time
        FROM
        sys_operation_log a
        LEFT JOIN sys_users b ON a.ope_user_id = b.su_id
        LEFT JOIN sys_vip_info c ON a.vip_id = c.id
        LEFT JOIN sys_shop_info d ON a.shop_id = d.id
        <where>
            a.company_id=#{param.companyId}
            <if test="param.shopId != null and param.shopId != 0  ">
                and  a.shop_id=#{param.shopId}
            </if>
            <if test="param.opeUserId != null">
                and  a.ope_user_id=#{param.opeUserId}
            </if>
            <if test="param.vipQueryKey != null and param.vipQueryKey != ''  ">
                and c.VIP_NAME like concat('%',#{param.vipQueryKey},'%')
                or (c.VIP_NO like concat('%',#{param.vipQueryKey},'%')
                or c.PHONE like concat('%',#{param.vipQueryKey},'%')
                )
            </if>
            <if test="param.opeFunction != null">
                and a.ope_function=#{param.opeFunction}
            </if>
            <if test="param.opeBut != null">
                and a.ope_but=#{param.opeBut}
            </if>
            <if test="param.billNo != null  and param.billNo != ''">
                and a.bill_no like concat('%',#{param.billNo},'%')
            </if>
            <if test="param.ip != null  and param.ip != ''">
                and a.ip like concat('%',#{param.ip},'%')
            </if>
            <if test="param.note != null and param.note != ''">
                and a.note like concat('%',#{param.note},'%')
            </if>
            <if test="param.startTime != null  ">
                and a.create_time  <![CDATA[>=]]> #{param.startTime}
            </if>
            <if test="param.endTime != null">
                and a.create_time <![CDATA[<=]]> #{param.endTime}
            </if>
            order by ${param.sort} ${param.order}
        </where>
    </select>
</mapper>
zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/operation-list.html
New file
@@ -0,0 +1,333 @@
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org" xmlns:matrix="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8">
    <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
    <meta name="renderer" content="webkit|ie-comp|ie-stand">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport"
          content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
    <meta http-equiv="Cache-Control" content="no-siteapp"/>
    <LINK rel="Bookmark" href="../images/favicon.ico">
    <!-- 本框架基本脚本和样式 -->
    <script type="text/javascript" th:src="@{/js/systools/MBaseVue.js}"></script>
    <link rel="stylesheet" th:href="@{/plugin/element-ui/index.css}">
    <link th:href="@{/css/styleOne/style.min.css}" rel="stylesheet" type="text/css"/>
    <title></title>
    <style>
        .panel-body{
            overflow: hidden;
        }
        .buttonPanel{
            background: #ffffff;
            padding: 10px 10px ;
            margin: 0px 0px 10px 0px;
        }
        .rowPanel{
            background: #ffffff;
            padding: 0px 10px ;
            padding-top: 10px;
            margin: 0px 0px 10px 0px;
        }
        .paginationStyle{
            background: #ffffff;
            padding: 10px 10px;
            margin: 0px 0px 10px 0px;
            text-align: right;
        }
    </style>
</head>
<body>
<div class="panel-body" id="app">
    <el-row class="buttonPanel">
        <el-button @click="exportExcel" type="primary" >导出</el-button>
    </el-row>
    <el-row class="rowPanel"  >
        <el-form ref="form" :model="form" inline >
            <el-form-item label="操作人" prop="flowType">
                <el-select v-model="form.opeUserId" placeholder="">
                    <el-option
                            v-for="item in userList"
                            :key="item.suId"
                            :label="item.suName"
                            :value="item.suId">
                    </el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="操作功能" prop="flowType">
                <el-select v-model="form.opeFunction" placeholder="">
                    <el-option
                            v-for="item in functionList"
                            :key="item.value"
                            :label="item.displayName"
                            :value="item.value">
                    </el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="操作按钮" prop="flowType">
                <el-select v-model="form.opeBut" placeholder="">
                    <el-option
                            v-for="item in btnList"
                            :key="item.value"
                            :label="item.displayName"
                            :value="item.value">
                    </el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="会员" prop="vipQueryKey">
                <el-input v-model="form.vipQueryKey" placeholder="请输入会员姓名/编号/手机"></el-input>
            </el-form-item>
            <el-form-item label="门店" prop="shopId">
                <el-select v-model="form.shopId" placeholder="请选择">
                    <el-option
                            v-for="item in shopList"
                            :key="item.shopShortName"
                            :label="item.shopShortName"
                            :value="item.id">
                    </el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="订单号" prop="billNo">
                <el-input v-model="form.billNo"></el-input>
            </el-form-item>
            <el-form-item label="IP" prop="ip">
                <el-input v-model="form.ip"></el-input>
            </el-form-item>
            <el-form-item label="备注" prop="note">
                <el-input v-model="form.note"></el-input>
            </el-form-item>
            <el-form-item label="时间" prop="datetimeArr">
                <el-date-picker
                        v-model="form.datetimeArr"
                        type="daterange"
                        range-separator="至" format="yyyy-MM-dd HH:mm"
                        start-placeholder="开始日期"
                        end-placeholder="结束日期">
                </el-date-picker>
            </el-form-item>
            <el-button type="primary" @click="search" >搜索</el-button>
            <el-button @click="resetForm('form')">重置</el-button>
        </el-form>
    </el-row>
    <el-row class="table-style"  >
        <el-table id="proj" :data="table.rows"  :height="height" stripe @sort-change="sortChange">
            <el-table-column
                    prop="shopName"
                    label="门店"
                    width="180">
            </el-table-column>
            <el-table-column
                    prop="opeUser"
                    label="操作用户"
                    width="240">
            </el-table-column>
            <el-table-column
                    prop="createTime"
                    sortable="custom"
                    label="操作时间"
                    show-overflow-tooltip
                    width="180">
            </el-table-column>
            <el-table-column
                    prop="opeFunctionLabel"
                    label="操作功能">
            </el-table-column>
            <el-table-column
                    prop="opeButLabel"
                    label="操作按钮">
            </el-table-column>
            <el-table-column
                    prop="billNo"
                    label="单据号">
            </el-table-column>
            <el-table-column
                    prop="vipName"
                    label="操作会员">
            </el-table-column>
            <el-table-column
                    prop="note"
                    label="备注">
            </el-table-column>
            <el-table-column
                    prop="ip"
                    label="IP地址">
            </el-table-column>
        </el-table>
    </el-row>
    <el-row class="paginationStyle"  >
        <el-pagination background
                       @size-change="changePageSize"
                       @current-change="changeCurrentPage"
                       :current-page="table.currentPage"
                       :page-sizes="[10, 20, 30, 50]"
                       :page-size="table.pageSize"
                       layout="total, sizes, prev, pager, next, jumper"
                       :total="table.total">
        </el-pagination>
    </el-row>
</div>
</body>
<script type="text/javascript" th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
<script type="text/javascript" th:src="@{/js/plugin/jquery.query.js}"></script>
<script type="text/javascript" th:src="@{/plugin/layer/layer.js}"></script>
<script type="text/javascript" th:src="@{/js/systools/AjaxProxyVue.js}"></script>
<script type="text/javascript" th:src="@{/js/plugin/vue.js}"></script>
<script type="text/javascript" th:src="@{/plugin/element-ui/index.js}"></script>
<script type="text/javascript" th:src="@{/plugin/moment.min.js}"></script>
<script type="text/javascript" th:inline="javascript">
    var vue = new Vue({
        el: '#app',
        data: {
            table:{
                rows:[],
                total:0,
                pageSize:10,
                currentPage:1,
            },
            form:{
                name:null,
                datetimeArr:'',
                payMethod:'',
                flowType:'',
                orderNo:'',
                oprationMan:'',
                queryKey:'',
                shopId:'',
            },
            userList: [],
            height:'calc(100vh - 240px)',
            functionList:[],
            btnList:[],
            shopList:[{id:0,shopShortName:'全部'}],
        },
        created: function () {
            let _this=this;
            //用户列表
            AjaxProxy.requst({
                app: _this,
                url: basePath + '/admin/allUser',
                callback: function (data) {
                    _this.userList = data.rows;
                }
            });
            //获取枚举列表
            AjaxProxy.requst({
                app: _this,
                url: basePath + '/common/data/getEnums',
                data:{"enumCodes":["operationFunction","operationButton"]},
                callback: function (data) {
                    _this.btnList = data.data.operationButton;
                    _this.functionList = data.data.operationFunction;
                    _this.form.opeFunction=_this.functionList[0].value;
                }
            });
            //加载门店
            AjaxProxy.requst({
                app:_this,
                url:basePath+"/admin/shopInfo/findAll",
                callback:function (data) {
                    data.rows.forEach(shop=>{
                        _this.shopList.push(shop);
                    });
                }
            })
            this.loadData();
            window.addEventListener("keydown", this.keydown);
        },
        methods: {
            changePageSize(val) {
                this.table.pageSize = val;
                this.loadData();
            },
            changeCurrentPage(val) {
                this.table.currentPage = val;
                this.loadData();
            },
            resetForm(formName) {
                this.$refs[formName].resetFields();
            },
            sortChange:function (column){
                if(column.order){
                    if(column.order.indexOf("desc")){
                        this.form.order="desc";
                    }else{
                        this.form.order="asc";
                    }
                    this.form.sort=column.prop;
                    this.loadData();
                }
            },
            loadData:function(){
                let _this = this;
                let data=_this.getRequestParam();
                data.pageSize=_this.table.pageSize;
                data.pageNum=_this.table.currentPagey56u;
                AjaxProxy.requst({
                    app: _this,
                    data:data,
                    url: basePath + '/admin/operation/getOperation',
                    callback: function (data) {
                        _this.table.rows = data.rows;
                        _this.table.total=data.total;
                    }
                });
            },
            getRequestParam(){
                let _this = this;
                let data=   {
                    shopId:_this.form.shopId,
                    opeUserId:_this.form.opeUserId,
                    vipQueryKey:_this.form.vipQueryKey,
                    opeFunction:_this.form.opeFunction,
                    opeBut:_this.form.opeBut,
                    billNo:_this.form.billNo,
                    ip:_this.form.ip,
                    note:_this.form.note,
                    startTime:_this.form.datetimeArr?moment(_this.form.datetimeArr[0]).format("YYYY-MM-DD HH:mm"):'',
                    endTime:_this.form.datetimeArr?moment(_this.form.datetimeArr[1]).format("YYYY-MM-DD HH:mm"):'',
                    order:_this.form.order,
                }
                console.log(data);
                return data;
            },
            search:function(){
                this.table.currentPage=1;
                this.loadData();
            },
            keydown(evt){
                if(evt.keyCode==13) {
                    this.search();
                }
            },
            //导出
            exportExcel(){
                window.location.href=basePath+"/admin/operation/exportExcel?"+MTools.jsonToUrlParam(this.getRequestParam());
            }
        }
    });
</script>
</body>
</html>