This commit is contained in:
=
2025-09-02 14:13:25 +08:00
163 changed files with 16426 additions and 6025 deletions
@@ -38,7 +38,7 @@ public class Globals {
//文件访问域名
public static String AppFileDomain = "";
//学校代码
public static String SchoolCode = "HMC";
public static String SchoolCode = "OTHER";
//系统自定义参数
public static NutMap MyConfig = NutMap.NEW();
//自定义路由
@@ -1,15 +1,25 @@
package com.budwk.app.zhgh.activity.declarereimbursement.declare.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.models.ActivityDeclareInfo;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.service.ActivityDeclareService;
import com.budwk.app.zhgh.staffmanage.member.models.MemberChangeRecord;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
@@ -22,8 +32,11 @@ import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.math.BigDecimal;
import java.util.List;
/**
* @version 1.0
@@ -43,6 +56,8 @@ public class ActivityDeclareApplyController {
@Inject
private FlowEngine flowEngine;
@Inject
private FlowCommonService flowCommonService;
@Inject
private ActivityDeclareService activityDeclareService;
@At("")
@@ -57,84 +72,73 @@ public class ActivityDeclareApplyController {
public void form() {
}
@At
@SaCheckPermission("activityDeclare.apply")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/apply/view.html")
public void view() {
}
@At
@ApiOperation("活动申报,我的申请列表")
@SaCheckPermission("activityDeclare.apply")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.startTime,
info.endTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke,
(SELECT MAX(id) FROM wf_process_task WHERE processInstanceId = ins.id AND taskName = 'startTask') AS startTaskId
FROM
activity_declare_info info
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityDeclareService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At
@ApiOperation("活动申报,查看活动申报")
@SaCheckPermission("activityDeclare.apply")
public Result findOne(@Valid String id) {
ActivityDeclareInfo info = dao.fetch(ActivityDeclareInfo.class, id);
return Result.success().addData(info);
}
@At
@ApiOperation("删除活动申报")
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("保存申请")
@SaCheckPermission("member.apply.submit")
@SLog(tag = "活动申报", msg = "删除活动申报id: ${args[0]}")
public Result onDelete(@Valid String id) {
dao.clear(ActivityDeclareInfo.class, Cnd.where("id", "=", id));
// 删除流程相关
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
@SLog(tag = "活动申报", msg = "保存申请,申请人: ${args[0].username}")
public Result save(@Param("data") ActivityDeclareInfo activityDeclareInfo) {
// 计算预算总金额
double sum = activityDeclareInfo.getBudgets().stream()
.mapToDouble(v -> ObjectUtil.defaultIfNull(v.getBudgetPrice(), 0D))
.sum();
activityDeclareInfo.setBudgetMoney(new BigDecimal(sum));
dao.insertOrUpdate(activityDeclareInfo);
return Result.success();
}
@At
@ApiOperation("提交申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.apply.submit")
@SLog(tag = "活动申报", msg = "提交申请,申请人: ${args[0].username}")
public Result submit(@Param("data") ActivityDeclareInfo activityDeclareInfo){
activityDeclareInfo.setYear(ObjectUtil.defaultIfNull(activityDeclareInfo.getYear(), DateUtil.thisYear()));
// 计算预算总金额
double sum = activityDeclareInfo.getBudgets().stream()
.mapToDouble(v -> ObjectUtil.defaultIfNull(v.getBudgetPrice(), 0D))
.sum();
activityDeclareInfo.setBudgetMoney(new BigDecimal(sum));
// 保存数据
dao.insertOrUpdate(activityDeclareInfo);
// 开启流程实例
Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, activityDeclareInfo);
args.set("type", activityDeclareInfo.getActivityType());
ProcessInstance instance = flowEngine.startProcessInstanceByKey("HDSB", activityDeclareInfo.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务
List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null);
for (ProcessTask task : doingTaskList) {
flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args);
}
return Result.success();
}
@At
@ApiOperation("重新提交申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.apply.submit")
@SLog(tag = "活动申报", msg = "重新提交申请,申请人: ${args[0].username}")
public Result submitAgain(@Param("data") ActivityDeclareInfo activityDeclareInfo, @Param("taskId") Long taskId) {
activityDeclareInfo.setYear(ObjectUtil.defaultIfNull(activityDeclareInfo.getYear(), DateUtil.thisYear()));
// 计算预算总金额
double sum = activityDeclareInfo.getBudgets().stream()
.mapToDouble(v -> ObjectUtil.defaultIfNull(v.getBudgetPrice(), 0D))
.sum();
activityDeclareInfo.setBudgetMoney(new BigDecimal(sum));
dao.insertOrUpdate(activityDeclareInfo);
Dict dict = Dict.create();
dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
dict.set("type", activityDeclareInfo.getActivityType());
flowCommonService.executeTask(dict);
return Result.success();
}
}
@@ -1,17 +1,28 @@
package com.budwk.app.zhgh.activity.declarereimbursement.declare.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.service.ActivityDeclareService;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* @version 1.0
* @Author zzr
@@ -50,7 +61,67 @@ public class ActivityDeclareBranchUnionController {
@ApiOperation("分工会审核列表")
@SaCheckPermission("activityDeclare.branchUnion")
public Result pageData(CommonPageParam pageParam) {
return Result.success();
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke
FROM
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN activity_declare_info info ON info.id = ins.businessNo
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10
LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
cnd.and("t.taskName", "=", "54f481d7-3239-4cd2-882d-e1cc18ea86eb");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (pageParam.getAudit()) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityDeclareService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
}
@@ -1,11 +1,26 @@
package com.budwk.app.zhgh.activity.declarereimbursement.declare.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.service.ActivityDeclareService;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* @version 1.0
* @Author zzr
@@ -19,6 +34,8 @@ import org.nutz.mvc.annotation.Ok;
@At("/platform/activityDeclare/clubPrincipal")
public class ActivityDeclareClubPrincipalController {
@Inject
private ActivityDeclareService activityDeclareService;
@At("")
@SaCheckPermission("activityDeclare.clubPrincipal")
@@ -31,4 +48,72 @@ public class ActivityDeclareClubPrincipalController {
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/clubprincipal/form.html")
public void form() {
}
@At
@ApiOperation("活动申报,协会负责人审核列表")
@SaCheckPermission("activityDeclare.clubPrincipal")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke
FROM
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN activity_declare_info info ON info.id = ins.businessNo
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10
LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
cnd.and("t.taskName", "=", "06d5979b-b52f-4df1-8974-087568322cd6");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (pageParam.getAudit()) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityDeclareService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
}
@@ -0,0 +1,152 @@
package com.budwk.app.zhgh.activity.declarereimbursement.declare.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.models.ActivityDeclareInfo;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.service.ActivityDeclareService;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.models.ActivityReimbursementInfo;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
/**
* @version 1.0
* @Author zzr
* @nameActivityDeclareMineController
* @Date 2025/8/26 10:14
* @注释
*/
@IocBean
@Ok("json")
@ApiOperation("我的活动申报")
@At("/platform/activityDeclare/mine")
public class ActivityDeclareMineController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private ActivityDeclareService activityDeclareService;
@At("")
@SaCheckPermission("activityDeclare.mine")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/mine/index.html")
public void index() {
}
@At
@ApiOperation("活动申报,我的申请列表")
@SaCheckPermission("activityDeclare.mine")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke,
(select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask' AND taskState in (10,20)) AS startTaskId
FROM
activity_declare_info info
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_MEMBER_ADMIN.name())) {
if (AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name())) {
cnd.and("info.unionId", "=", SecurityUtil.getUnionId());
} else {
cnd.and("info.userId", "=", SecurityUtil.getUserId());
}
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityDeclareService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At
@ApiOperation("活动申报,查看活动申报")
@SaCheckPermission("activityDeclare.mine")
public Result findOne(@Valid String id) {
ActivityDeclareInfo info = dao.fetch(ActivityDeclareInfo.class, id);
return Result.success().addData(info);
}
@At
@ApiOperation("删除活动申报")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.apply.submit")
@SLog(tag = "活动申报", msg = "删除活动申报id: ${args[0]}")
public Result onDelete(@Valid String id) {
dao.clear(ActivityDeclareInfo.class, Cnd.where("id", "=", id));
// 删除流程相关
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
// 如果有报销的流程,也一并删除
ActivityReimbursementInfo reimbursementInfo = dao.fetch(ActivityReimbursementInfo.class, Cnd.where("declareId", "=", id));
if (Lang.isNotEmpty(reimbursementInfo)) {
dao.clear(ActivityReimbursementInfo.class, Cnd.where("id", "=", reimbursementInfo.getId()));
// 删除流程相关
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(reimbursementInfo.getId());
}
return Result.success();
}
}
@@ -1,11 +1,26 @@
package com.budwk.app.zhgh.activity.declarereimbursement.declare.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.service.ActivityDeclareService;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* @version 1.0
* @Author zzr
@@ -19,6 +34,9 @@ import org.nutz.mvc.annotation.Ok;
@At("/platform/activityDeclare/schoolPrincipal")
public class ActivityDeclareSchoolPrincipalController {
@Inject
private ActivityDeclareService activityDeclareService;
@At("")
@SaCheckPermission("activityDeclare.schoolPrincipal")
@@ -31,4 +49,72 @@ public class ActivityDeclareSchoolPrincipalController {
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/schoolprincipal/form.html")
public void form() {
}
@At
@ApiOperation("活动申报,校工会负责人审核列表")
@SaCheckPermission("activityDeclare.schoolPrincipal")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke
FROM
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN activity_declare_info info ON info.id = ins.businessNo
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10
LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
cnd.and("t.taskName", "=", "5b511275-143f-4ecd-8eff-7c8ad1456b1b");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (pageParam.getAudit()) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityDeclareService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
}
@@ -1,11 +1,26 @@
package com.budwk.app.zhgh.activity.declarereimbursement.declare.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.service.ActivityDeclareService;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* @version 1.0
* @Author zzr
@@ -19,6 +34,9 @@ import org.nutz.mvc.annotation.Ok;
@At("/platform/activityDeclare/schoolUnion")
public class ActivityDeclareSchoolUnionController {
@Inject
private ActivityDeclareService activityDeclareService;
@At("")
@SaCheckPermission("activityDeclare.schoolUnion")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/schoolunion/index.html")
@@ -30,4 +48,71 @@ public class ActivityDeclareSchoolUnionController {
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/schoolunion/form.html")
public void form() {
}
@At
@ApiOperation("活动申报,校工会审核列表")
@SaCheckPermission("activityDeclare.schoolUnion")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke
FROM
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN activity_declare_info info ON info.id = ins.businessNo
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10
LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
cnd.and("t.taskName", "=", "81428a9b-63c0-44b8-a28c-17d282c2cc8e");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (pageParam.getAudit()) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityDeclareService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
}
@@ -1,5 +1,17 @@
package com.budwk.app.zhgh.activity.declarereimbursement.declare.interceptor;
import cn.hutool.core.date.DateUtil;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowInterceptor;
import com.budwk.app.flow.engine.core.Execution;
import com.budwk.app.flow.engine.core.ServiceContext;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.models.ActivityDeclareInfo;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.json.Json;
/**
* @version 1.0
* @Author zzr
@@ -7,5 +19,21 @@ package com.budwk.app.zhgh.activity.declarereimbursement.declare.interceptor;
* @Date 2025/8/1 11:05
* @注释
*/
public class ActivityDeclareInterceptor {
public class ActivityDeclareInterceptor implements FlowInterceptor {
@Override
public void intercept(Execution execution) {
String formDataStr = execution.getArgs().getStr(FlowConst.FORM_DATA);
Dao dao = ServiceContext.find(Dao.class);
ActivityDeclareInfo declareInfo = Json.fromJson(ActivityDeclareInfo.class, formDataStr);
declareInfo.setYear(DateUtil.thisYear());
// 设置流程变量
execution.getArgs().set("type", declareInfo.getActivityType());
dao.insertOrUpdate(declareInfo);
execution.getArgs().set(FlowConst.FORM_DATA, Json.toJson(declareInfo));
int instanceId = execution.getArgs().getInt(FlowConst.PROCESS_INSTANCE_ID_KEY);
dao.update(ProcessInstance.class, Chain.make("businessNo", declareInfo.getId()), Cnd.where(ProcessInstance::getId, "=", instanceId));
}
}
@@ -2,12 +2,13 @@ package com.budwk.app.zhgh.activity.declarereimbursement.declare.models;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.model.BaseModel;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.ActivityBudget;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.ActivityBudgetVO;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@@ -90,14 +91,14 @@ public class ActivityDeclareInfo extends BaseModel {
private String activityAddress;
@Column
@Comment("活动开始时间")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String startTime;
@Comment("活动计划开始时间")
@ColDefine(type = ColType.DATETIME)
private Date planStartTime;
@Column
@Comment("活动结束时间")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String endTime;
@Comment("活动计划结束时间")
@ColDefine(type = ColType.DATETIME)
private Date planEndTime;
@Column
@Comment("活动类型")
@@ -105,7 +106,7 @@ public class ActivityDeclareInfo extends BaseModel {
private String activityType;
@Column
@Comment("活动内容")
@Comment("活动方案及简介")
@ColDefine(type = ColType.TEXT)
private String activityContent;
@@ -122,6 +123,10 @@ public class ActivityDeclareInfo extends BaseModel {
@Column
@Comment("活动经费预算")
@ColDefine(type = ColType.MYSQL_JSON)
private List<ActivityBudget> budgets;
private List<ActivityBudgetVO> budgets;
@Column
@Comment("预算总金额")
@ColDefine(customType = "decimal(10,2)")
private BigDecimal budgetMoney;
}
@@ -1,12 +1,22 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.models.ActivityDeclareInfo;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.models.ActivityReimbursementInfo;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service.ActivityReimbursementService;
@@ -19,11 +29,15 @@ import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.math.BigDecimal;
import java.util.List;
/**
* @version 1.0
@@ -43,6 +57,8 @@ public class ActivityReimbursementApplyController {
@Inject
private FlowEngine flowEngine;
@Inject
private FlowCommonService flowCommonService;
@Inject
private ActivityReimbursementService activityReimbursementService;
@At("")
@@ -57,75 +73,142 @@ public class ActivityReimbursementApplyController {
public void form() {
}
@At
@SaCheckPermission("activityReimbursement.apply")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/apply/view.html")
public void view() {
}
@At
@ApiOperation("活动报销,我的申请列表")
@SaCheckPermission("activityDeclare.apply")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.startTime,
info.endTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke,
(SELECT MAX(id) FROM wf_process_task WHERE processInstanceId = ins.id AND taskName = 'startTask') AS startTaskId
FROM
activity_reimbursement_info info
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityReimbursementService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At
@ApiOperation("删除活动报销")
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("保存申请")
@SaCheckPermission("member.apply.submit")
@SLog(tag = "活动报", msg = "删除活动报销id: ${args[0]}")
public Result onDelete(@Valid String id) {
dao.clear(ActivityReimbursementInfo.class, Cnd.where("id", "=", id));
// 删除流程相关
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
@SLog(tag = "活动", msg = "保存申请,申请人: ${args[0].username}")
public Result save(@Param("data") ActivityReimbursementInfo activityReimbursementInfo) {
if (StrUtil.isBlank(activityReimbursementInfo.getDeclareId())) {
activityReimbursementInfo.setDeclareId(activityReimbursementInfo.getDeclareId());
}
// 计算实际总金额
double sum = activityReimbursementInfo.getBudgets().stream()
.mapToDouble(v -> ObjectUtil.defaultIfNull(v.getActualPrice(), 0D))
.sum();
activityReimbursementInfo.setBudgetMoney(new BigDecimal(sum));
dao.insertOrUpdate(activityReimbursementInfo);
return Result.success();
}
@At
@ApiOperation("提交申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.apply.submit")
@SLog(tag = "活动申报", msg = "提交申请,申请人: ${args[0].username}")
public Result submit(@Param("data") ActivityReimbursementInfo activityReimbursementInfo){
if (StrUtil.isBlank(activityReimbursementInfo.getDeclareId())) {
activityReimbursementInfo.setDeclareId(activityReimbursementInfo.getDeclareId());
}
activityReimbursementInfo.setYear(ObjectUtil.defaultIfNull(activityReimbursementInfo.getYear(), DateUtil.thisYear()));
// 计算实际总金额
double sum = activityReimbursementInfo.getBudgets().stream()
.mapToDouble(v -> ObjectUtil.defaultIfNull(v.getActualPrice(), 0D))
.sum();
activityReimbursementInfo.setBudgetMoney(new BigDecimal(sum));
dao.insertOrUpdate(activityReimbursementInfo);
// 开启流程实例
Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, activityReimbursementInfo);
ProcessInstance instance = flowEngine.startProcessInstanceByKey("HDSB", activityReimbursementInfo.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务
List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null);
for (ProcessTask task : doingTaskList) {
flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args);
}
return Result.success();
}
@At
@ApiOperation("重新提交申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.apply.submit")
@SLog(tag = "活动申报", msg = "重新提交申请,申请人: ${args[0].username}")
public Result submitAgain(@Param("data") ActivityReimbursementInfo activityReimbursementInfo, @Param("taskId") Long taskId) {
if (StrUtil.isBlank(activityReimbursementInfo.getDeclareId())) {
activityReimbursementInfo.setDeclareId(activityReimbursementInfo.getDeclareId());
}
activityReimbursementInfo.setYear(ObjectUtil.defaultIfNull(activityReimbursementInfo.getYear(), DateUtil.thisYear()));
// 计算实际总金额
double sum = activityReimbursementInfo.getBudgets().stream()
.mapToDouble(v -> ObjectUtil.defaultIfNull(v.getActualPrice(), 0D))
.sum();
activityReimbursementInfo.setBudgetMoney(new BigDecimal(sum));
dao.insertOrUpdate(activityReimbursementInfo);
Dict dict = Dict.create();
dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
flowCommonService.executeTask(dict);
return Result.success();
}
@At
@ApiOperation("获取当前用户活动报销")
@SaCheckPermission("activityReimbursement.apply")
public Result getActivityReimbursementByUser() {
// 查询reimbursement表里面没有,在declare表里面有的申请记录
Sql sql = Sqls.create("SELECT declareId FROM activity_reimbursement_info WHERE userId = @userId").setParam("userId", SecurityUtil.getUserId());
sql.setCallback(Sqls.callback.strList());
dao.execute(sql);
List<String> declareIdList = sql.getList(String.class);
Sql applySql = Sqls.create("""
SELECT
info.*
FROM
activity_declare_info info
LEFT JOIN wf_process_instance ins ON info.id = ins.businessNo
$condition
""");
Cnd cnd = Cnd.NEW();
if (Lang.isNotEmpty(declareIdList)) {
cnd.and("info.id", "in", declareIdList);
}
cnd.and("info.userId", "=", SecurityUtil.getUserId());
cnd.and("ins.state", "=", 20);
applySql.setCondition(cnd);
List<NutMap> resultList = activityReimbursementService.listMap(applySql);
return Result.success().addData(resultList);
}
@At
@ApiOperation("获取收款人卡号")
@SaCheckPermission("activityReimbursement.apply")
public Result getCardNumberByPayeeId(String username) {
Sql sql = Sqls.create("""
SELECT
JT.bankName,
JT.bankCardNum
FROM
activity_reimbursement_info AS info,
JSON_TABLE(
budgets,
'$[*]' COLUMNS(
username VARCHAR(255) PATH '$.username',
bankName VARCHAR(255) PATH '$.bankName',
bankCardNum VARCHAR(255) PATH '$.bankCardNum'
)
) AS JT
WHERE
JT.username = @username
ORDER BY info.applyTime DESC LIMIT 1
""").setParam("username", username);
sql.setCallback(Sqls.callback.map());
dao.execute(sql);
NutMap map = (NutMap) sql.getResult();
return Result.success().addData(map);
}
}
@@ -0,0 +1,274 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.activity.declarereimbursement.enums.ActivityDeclareReimbursement;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service.ActivityReimbursementService;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @version 1.0
* @Author zzr
* @nameActivityReimbursementBoardController
* @Date 2025/8/26 16:10
* @注释
*/
@IocBean
@Ok("json")
@ApiOperation("活动报销图表展示")
@At("/platform/activityReimbursement/board")
public class ActivityReimbursementBoardController {
@Inject
private Dao dao;
@Inject
private ActivityReimbursementService activityReimbursementService;
@At("")
@SaCheckPermission("activityReimbursement.board")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/board/index.html")
public void index() {
}
@At
@ApiOperation("获取参与人数和活动报销经费数据")
@SaCheckPermission("activityReimbursement.board")
public Result getNumData(Integer startYear, Integer endYear){
Sql schoolSignNum = activityReimbursementService.getActivityUserNumAndMoneySql(startYear, endYear, false).setParam("type", ActivityDeclareReimbursement.SCHOOL_UNION.name());
Sql unionSignNum = activityReimbursementService.getActivityUserNumAndMoneySql(startYear, endYear, false).setParam("type", ActivityDeclareReimbursement.BRANCH_UNION.name());
Sql clubSignNum = activityReimbursementService.getActivityUserNumAndMoneySql(startYear, endYear, false).setParam("type", ActivityDeclareReimbursement.CLUB.name());
Sql schoolActivityMoney = activityReimbursementService.getActivityUserNumAndMoneySql(startYear, endYear, true).setParam("type", ActivityDeclareReimbursement.SCHOOL_UNION.name());
Sql unionActivityMoney = activityReimbursementService.getActivityUserNumAndMoneySql(startYear, endYear, true).setParam("type", ActivityDeclareReimbursement.BRANCH_UNION.name());
Sql clubActivityMoney = activityReimbursementService.getActivityUserNumAndMoneySql(startYear, endYear, true).setParam("type", ActivityDeclareReimbursement.CLUB.name());
HashMap result = new HashMap() {{
put("schoolSignNum", activityReimbursementService.listMap(schoolSignNum).stream().mapToInt(v->v.getInt("activityNum")).sum());
put("unionSignNum", activityReimbursementService.listMap(unionSignNum).stream().mapToInt(v->v.getInt("activityNum")).sum());
put("clubSignNum", activityReimbursementService.listMap(clubSignNum).stream().mapToInt(v->v.getInt("activityNum")).sum());
put("schoolActivityMoney", activityReimbursementService.count(schoolActivityMoney));
put("unionActivityMoney", activityReimbursementService.count(unionActivityMoney));
put("clubActivityMoney", activityReimbursementService.count(clubActivityMoney));
}};
return Result.success(result);
}
@At
@ApiOperation("获取活动的类型数量柱状图")
@SaCheckPermission("activityReimbursement.board")
public Result getActivityTypeChart(Integer startYear, Integer endYear){
Sql sql = Sqls.create("""
SELECT
count(1)
FROM
activity_reimbursement_info info
LEFT JOIN wf_process_instance ins ON info.id = ins.businessNo
WHERE
ins.state = 30
AND info.activityType = @type
AND info.`year` = @year
""");
List<NutMap> list = new ArrayList<>();
if (startYear == null || endYear == null) {
int nowYear = DateUtil.thisYear();
startYear = nowYear - 9;
endYear = nowYear;
}
for (int i = startYear; i <= endYear; i++) {
final int year = i;
list.add(new NutMap() {{
put("year", year);
put("type", "校工会活动");
put("num", activityReimbursementService.count(sql.setParam("type", ActivityDeclareReimbursement.SCHOOL_UNION.name()).setParam("year", year)));
}});
list.add(new NutMap() {{
put("year", year);
put("type", "分工会活动");
put("num", activityReimbursementService.count(sql.setParam("type", ActivityDeclareReimbursement.BRANCH_UNION.name()).setParam("year", year)));
}});
list.add(new NutMap() {{
put("year", year);
put("type", "社团活动");
put("num", activityReimbursementService.count(sql.setParam("type", ActivityDeclareReimbursement.CLUB.name()).setParam("year", year)));
}});
}
return Result.success().addData(list);
}
@At
@ApiOperation("获取活动的类型数量饼图")
@SaCheckPermission("activityReimbursement.board")
public Result getActivityTypePieNum(Integer startYear, Integer endYear){
Sql sql = Sqls.create("""
SELECT
count(1)
FROM
activity_reimbursement_info info
LEFT JOIN wf_process_instance ins ON info.id = ins.businessNo
WHERE
ins.state = 30
AND activityType = @type
AND `year` <= @startYear
AND `year` >= @endYear
""").setParam("startYear", startYear).setParam("endYear", endYear);
List<NutMap> list = new ArrayList<>();
list.add(new NutMap() {{
put("type", "校工会活动");
put("num", activityReimbursementService.count(sql.setParam("type", ActivityDeclareReimbursement.SCHOOL_UNION.name())));
}});
list.add(new NutMap() {{
put("type", "分工会活动");
put("num", activityReimbursementService.count(sql.setParam("type", ActivityDeclareReimbursement.BRANCH_UNION.name())));
}});
list.add(new NutMap() {{
put("type", "社团活动");
put("num", activityReimbursementService.count(sql.setParam("type", ActivityDeclareReimbursement.CLUB.name())));
}});
return Result.success(list);
}
@At
@ApiOperation("获取活动的经费统计图")
@SaCheckPermission("activityReimbursement.board")
public Result getActivityMoneyChart(Integer startYear, Integer endYear){
Sql sql = Sqls.create("""
SELECT
IFNULL(sum(info.actualMoney), 0) money
FROM
activity_reimbursement_info info
LEFT JOIN wf_process_instance ins ON info.id = ins.businessNo
WHERE
ins.state = 30
AND info.activityType = @type
AND info.`year` = @year
""");
List<NutMap> list = new ArrayList<>();
if (startYear == null || endYear == null) {
int nowYear = DateUtil.thisYear();
startYear = nowYear - 9;
endYear = nowYear;
}
for (int i = startYear; i <= endYear; i++) {
final int year = i;
list.add(new NutMap() {{
put("year", year);
put("type", "校工会费用");
put("num", activityReimbursementService.list(sql.setParam("type", ActivityDeclareReimbursement.SCHOOL_UNION.name()).setParam("year", year)).get(0).getDouble("money"));
}});
list.add(new NutMap() {{
put("year", year);
put("type", "分工会费用");
put("num", activityReimbursementService.list(sql.setParam("type", ActivityDeclareReimbursement.BRANCH_UNION.name()).setParam("year", year)).get(0).getDouble("money"));
}});
list.add(new NutMap() {{
put("year", year);
put("type", "社团费用");
put("num", activityReimbursementService.list(sql.setParam("type", ActivityDeclareReimbursement.CLUB.name()).setParam("year", year)).get(0).getDouble("money"));
}});
}
return Result.success(list);
}
@At
@ApiOperation("获取活动的经费饼图")
@SaCheckPermission("activityReimbursement.board")
public Result getActivityMoneyPieNum(Integer startYear, Integer endYear){
Sql schoolSql = activityReimbursementService.getActivityUserNumAndMoneySql(startYear, endYear, true).setParam("type", ActivityDeclareReimbursement.SCHOOL_UNION.name());
Sql unionSql = activityReimbursementService.getActivityUserNumAndMoneySql(startYear, endYear, true).setParam("type", ActivityDeclareReimbursement.BRANCH_UNION.name());
Sql clubSql = activityReimbursementService.getActivityUserNumAndMoneySql(startYear, endYear, true).setParam("type", ActivityDeclareReimbursement.CLUB.name());
List<NutMap> list = new ArrayList<>();
list.add(new NutMap() {{
put("type", "校工会费用");
put("num", activityReimbursementService.count(schoolSql));
}});
list.add(new NutMap() {{
put("type", "分工会费用");
put("num", activityReimbursementService.count(unionSql));
}});
list.add(new NutMap() {{
put("type", "社团费用");
put("num", activityReimbursementService.count(clubSql));
}});
return Result.success().addData(list);
}
@At
@ApiOperation("所有工会的报销费用或活动数统计")
@SaCheckPermission("activityReimbursement.board")
public Result allUnionActivityAndMoney(Integer year, Boolean isUnionMoney){
Sql sql = Sqls.create("""
SELECT
su.`name` AS unionname,
$unionSql
FROM
sys_union su
LEFT JOIN activity_reimbursement_info info ON su.id = info.unionId
AND info.activityType = "BRANCH_UNION"
AND info.`year` = @year
GROUP BY
su.`name`
ORDER BY
su.unionCode ASC
""").setParam("year", year);
sql.setVar("unionSql", isUnionMoney ? new Static(" COALESCE(SUM(info.actualMoney), 0) AS money ") : new Static(" count(info.id) as money "));
List<NutMap> list = activityReimbursementService.listMap(sql);
return Result.success(list);
}
@At
@ApiOperation("所有协会的报销费用或活动数统计")
@SaCheckPermission("activityReimbursement.board")
public Result allClubActivityAndMoney(Integer year, Boolean isClubMoney) {
Sql sql = Sqls.create("""
SELECT
sc.clubName,
$clubSql
FROM
sys_club sc
LEFT JOIN activity_reimbursement_info info ON sc.id = info.clubId
AND info.`year` = @year
AND info.activityType = "CLUB"
GROUP BY
sc.id
ORDER BY
sc.clubCode ASC
""").setParam("year", year);
sql.setVar("clubSql", isClubMoney ? new Static(" COALESCE(SUM(info.actualMoney), 0) AS money ") : new Static(" count(info.id) as money "));
List<NutMap> list = activityReimbursementService.listMap(sql);
return Result.success(list);
}
}
@@ -1,11 +1,26 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service.ActivityReimbursementService;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* @version 1.0
* @Author zzr
@@ -15,10 +30,13 @@ import org.nutz.mvc.annotation.Ok;
*/
@IocBean
@Ok("json")
@ApiOperation("活动报,分工会管理员审核")
@ApiOperation("活动报,分工会管理员审核")
@At("/platform/activityReimbursement/branchUnion")
public class ActivityReimbursementBranchUnionController {
@Inject
private ActivityReimbursementService activityReimbursementService;
@At("")
@SaCheckPermission("activityReimbursement.branchUnion")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/branchunion/index.html")
@@ -30,4 +48,72 @@ public class ActivityReimbursementBranchUnionController {
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/branchunion/form.html")
public void form() {
}
@At
@ApiOperation("活动报销,分工会审核列表")
@SaCheckPermission("activityReimbursement.branchUnion")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke
FROM
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN activity_reimbursement_info info ON info.id = ins.businessNo
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10
LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
cnd.and("t.taskName", "=", "1e4cc473-beae-427d-b9dc-c1c4d0eb07c8");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (pageParam.getAudit()) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityReimbursementService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
}
@@ -1,11 +1,26 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service.ActivityReimbursementService;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* @version 1.0
* @Author zzr
@@ -15,10 +30,12 @@ import org.nutz.mvc.annotation.Ok;
*/
@IocBean
@Ok("json")
@ApiOperation("活动报,协会负责人审核")
@ApiOperation("活动报,协会负责人审核")
@At("/platform/activityReimbursement/clubPrincipal")
public class ActivityReimbursementClubPrincipalController {
@Inject
private ActivityReimbursementService activityReimbursementService;
@At("")
@SaCheckPermission("activityReimbursement.clubPrincipal")
@@ -31,4 +48,73 @@ public class ActivityReimbursementClubPrincipalController {
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/clubprincipal/form.html")
public void form() {
}
@At
@ApiOperation("活动报销,协会负责人审核列表")
@SaCheckPermission("activityReimbursement.clubPrincipal")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke
FROM
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN activity_reimbursement_info info ON info.id = ins.businessNo
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10
LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
cnd.and("t.taskName", "=", "5afcf810-7a8b-4896-9aa7-c99995e0856b");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (pageParam.getAudit()) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityReimbursementService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
}
@@ -0,0 +1,139 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.models.ActivityReimbursementInfo;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service.ActivityReimbursementService;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
/**
* @version 1.0
* @Author zzr
* @nameActivityReimbursementMineController
* @Date 2025/8/26 11:16
* @注释
*/
@IocBean
@Ok("json")
@ApiOperation("我的活动报销")
@At("/platform/activityReimbursement/mine")
public class ActivityReimbursementMineController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private ActivityReimbursementService activityReimbursementService;
@At("")
@SaCheckPermission("activityReimbursement.mine")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/mine/index.html")
public void index() {
}
@At
@ApiOperation("活动报销,我的申请列表")
@SaCheckPermission("activityReimbursement.mine")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.startTime,
info.endTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke,
(select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask' AND taskState in (10,20)) AS startTaskId
FROM
activity_reimbursement_info info
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_MEMBER_ADMIN.name())) {
if (AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name())) {
cnd.and("info.unionId", "=", SecurityUtil.getUnionId());
} else {
cnd.and("info.userId", "=", SecurityUtil.getUserId());
}
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityReimbursementService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At
@ApiOperation("活动报销,查看活动报销")
@SaCheckPermission("activityReimbursement.mine")
public Result findOne(@Valid String id) {
ActivityReimbursementInfo info = dao.fetch(ActivityReimbursementInfo.class, id);
return Result.success().addData(info);
}
@At
@ApiOperation("删除活动报销")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("activityReimbursement.mine")
@SLog(tag = "活动报销", msg = "删除活动报销id: ${args[0]}")
public Result onDelete(@Valid String id) {
dao.clear(ActivityReimbursementInfo.class, Cnd.where("id", "=", id));
// 删除流程相关
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
return Result.success();
}
}
@@ -1,11 +1,26 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service.ActivityReimbursementService;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* @version 1.0
* @Author zzr
@@ -15,10 +30,12 @@ import org.nutz.mvc.annotation.Ok;
*/
@IocBean
@Ok("json")
@ApiOperation("活动报,校工会负责人审核")
@ApiOperation("活动报,校工会负责人审核")
@At("/platform/activityReimbursement/schoolPrincipal")
public class ActivityReimbursementSchoolPrincipalController {
@Inject
private ActivityReimbursementService activityReimbursementService;
@At("")
@SaCheckPermission("activityReimbursement.schoolPrincipal")
@@ -31,4 +48,72 @@ public class ActivityReimbursementSchoolPrincipalController {
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/schoolprincipal/form.html")
public void form() {
}
@At
@ApiOperation("活动报销,校工会负责人审核列表")
@SaCheckPermission("activityReimbursement.schoolPrincipal")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke
FROM
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN activity_reimbursement_info info ON info.id = ins.businessNo
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10
LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
cnd.and("t.taskName", "=", "6dd2e8b3-fd0d-4b35-bb2a-1eef227cba96");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (pageParam.getAudit()) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityReimbursementService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
}
@@ -1,11 +1,26 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service.ActivityReimbursementService;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* @version 1.0
* @Author zzr
@@ -15,10 +30,13 @@ import org.nutz.mvc.annotation.Ok;
*/
@IocBean
@Ok("json")
@ApiOperation("活动报,校工会审核")
@ApiOperation("活动报,校工会审核")
@At("/platform/activityReimbursement/schoolUnion")
public class ActivityReimbursementSchoolUnionController {
@Inject
private ActivityReimbursementService activityReimbursementService;
@At("")
@SaCheckPermission("activityReimbursement.schoolUnion")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/schoolunion/index.html")
@@ -30,4 +48,72 @@ public class ActivityReimbursementSchoolUnionController {
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/schoolunion/form.html")
public void form() {
}
@At
@ApiOperation("活动报销,校工会审核列表")
@SaCheckPermission("activityReimbursement.schoolUnion")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke
FROM
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN activity_reimbursement_info info ON info.id = ins.businessNo
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10
LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
cnd.and("t.taskName", "=", "47bfdf53-288c-4352-a403-0653483b54eb");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (pageParam.getAudit()) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityReimbursementService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
}
@@ -1,5 +1,16 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.interceptor;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowInterceptor;
import com.budwk.app.flow.engine.core.Execution;
import com.budwk.app.flow.engine.core.ServiceContext;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.models.ActivityReimbursementInfo;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.json.Json;
/**
* @version 1.0
* @Author zzr
@@ -7,5 +18,21 @@ package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.intercept
* @Date 2025/8/1 11:05
* @注释
*/
public class ActivityReimbursementInterceptor {
public class ActivityReimbursementInterceptor implements FlowInterceptor {
@Override
public void intercept(Execution execution) {
String formDataStr = execution.getArgs().getStr(FlowConst.FORM_DATA);
Dao dao = ServiceContext.find(Dao.class);
ActivityReimbursementInfo reimbursementInfo = Json.fromJson(ActivityReimbursementInfo.class, formDataStr);
reimbursementInfo.setDeclareId(reimbursementInfo.getId());
// 设置流程变量
execution.getArgs().set("type", reimbursementInfo.getActivityType());
dao.insertOrUpdate(reimbursementInfo);
execution.getArgs().set(FlowConst.FORM_DATA, Json.toJson(reimbursementInfo));
int instanceId = execution.getArgs().getInt(FlowConst.PROCESS_INSTANCE_ID_KEY);
dao.update(ProcessInstance.class, Chain.make("businessNo", reimbursementInfo.getId()), Cnd.where(ProcessInstance::getId, "=", instanceId));
}
}
@@ -6,6 +6,8 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
@@ -25,6 +27,21 @@ public class ActivityReimbursementInfo extends ActivityDeclareInfo {
@ColDefine(type = ColType.VARCHAR, width = 32)
private String declareId;
@Column
@Comment("实际总金额")
@ColDefine(customType = "decimal(10,2)")
private BigDecimal actualMoney;
@Column
@Comment("活动开始时间")
@ColDefine(type = ColType.DATETIME)
private Date startTime;
@Column
@Comment("活动结束时间")
@ColDefine(type = ColType.DATETIME)
private Date endTime;
@Column
@Comment("发票")
@ColDefine(type = ColType.MYSQL_JSON)
@@ -2,6 +2,7 @@ package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.models.ActivityReimbursementInfo;
import org.nutz.dao.sql.Sql;
/**
* @version 1.0
@@ -11,4 +12,7 @@ import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.models.Act
* @注释
*/
public interface ActivityReimbursementService extends BaseService<ActivityReimbursementInfo> {
Sql getActivityUserNumAndMoneySql(Integer startYear, Integer endYear, Boolean isActivityMoney);
}
@@ -4,6 +4,8 @@ import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.models.ActivityReimbursementInfo;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service.ActivityReimbursementService;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.IocBean;
/**
@@ -18,4 +20,37 @@ public class ActivityReimbursementServiceImpl extends BaseServiceImpl<ActivityRe
public ActivityReimbursementServiceImpl(Dao dao) {
super(dao);
}
@Override
public Sql getActivityUserNumAndMoneySql(Integer startYear, Integer endYear, Boolean isActivityMoney) {
if (isActivityMoney) {
return Sqls.create("""
SELECT
SUM(info.actualMoney)
FROM
activity_reimbursement_info info
LEFT JOIN wf_process_instance ins ON info.id = ins.businessNo
WHERE
ins.state = 30
AND info.activityType = @type
AND info.`year` >= @startYear
AND info.`year` <= @endYear
""")
.setParam("startYear", startYear).setParam("endYear", endYear);
} else {
return Sqls.create("""
SELECT
info.activityNumber AS activityNum
FROM
activity_reimbursement_info info
LEFT JOIN wf_process_instance ins ON info.id = ins.businessNo
WHERE
ins.state = 30
AND info.activityType = @type
AND info.`year` >= @startYear
AND info.`year` <= @endYear
""").setParam("startYear", startYear).setParam("endYear", endYear);
}
}
}
@@ -13,7 +13,7 @@ import lombok.Data;
*/
@Data
@ApiModel("费用预算")
public class ActivityBudget {
public class ActivityBudgetVO {
@ApiModelProperty(value = "名称")
private String name;
@@ -0,0 +1,25 @@
package com.budwk.app.zhgh.mall.controller.buy;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
/**
* @version 1.0
* @Author zzr
* @nameMallBuyHomeController
* @Date 2025/8/6 11:14
* @注释
*/
@IocBean
@Ok("json:full")
@At("/platform/mall/buy/home")
public class MallBuyHomeController {
@At("")
@Ok("beetl:/platform/zhgh/mall/buy/home/index.html")
// @SaCheckPermission("mall.category.manage")
public void index() {
}
}
@@ -0,0 +1,25 @@
package com.budwk.app.zhgh.mall.controller.buy;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
/**
* @version 1.0
* @Author zzr
* @nameMallCartHomeController
* @Date 2025/8/6 16:20
* @注释
*/
@IocBean
@Ok("json:full")
@At("/platform/mall/buy/cart")
public class MallCartHomeController {
@At("")
@Ok("beetl:/platform/zhgh/mall/buy/cart/index.html")
// @SaCheckPermission("mall.category.manage")
public void index() {
}
}
@@ -0,0 +1,150 @@
package com.budwk.app.zhgh.mall.controller.manage.goods;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.mall.models.entity.goods.MallCategory;
import com.budwk.app.zhgh.mall.param.goods.MallCategorySearchParams;
import com.budwk.app.zhgh.mall.service.goods.MallCategoryService;
import com.budwk.app.zhgh.mall.models.vo.goods.MallCategoryVO;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameMallCategoryManagerController
* @Date 2025/7/16 9:23
* @注释 商品分类
*/
@IocBean
@Ok("json:full")
@At("/platform/mall/category/manage")
public class MallCategoryManagerController {
@Inject
private Dao dao;
@Inject
private MallCategoryService categoryService;
@At("")
@Ok("beetl:/platform/zhgh/mall/manage/goods/category/index.html")
// @SaCheckPermission("mall.category.manage")
public void index() {
}
/**
* 查询某分类下的全部子分类列表
* @param parentId
* @return
*/
@At("/all-children")
// @SaCheckPermission("mall.category.manage")
public Result list(@Valid String parentId){
List<MallCategory> query = dao.query(MallCategory.class, Cnd.where("parentId", "=", parentId).asc("sortOrder"));
return Result.success(query);
}
/**
* 查询全部分类列表
* @param categorySearchParams
* @return
*/
@At("/allChildren")
// @SaCheckPermission("mall.category.manage")
public Result list(MallCategorySearchParams categorySearchParams){
List<MallCategoryVO> mallCategoryVOList = categoryService.listCategory(categorySearchParams);
return Result.success(mallCategoryVOList);
}
@At
@SLog(tag = "商品分类", msg = "添加商品分类")
// @SaCheckPermission("mall.category.manage")
public Result saveCategory(MallCategory category){
if (category.getParentId() != null && !"0".equals(category.getParentId())) {
int count = dao.count(MallCategory.class, Cnd.where("id", "=", category.getParentId()));
if (count == 0) {
return Result.error("该分类名称已存在");
}
if (category.getLevel() >= 4) {
return Result.error("最多为三级分类,添加失败");
}
}
categoryService.saveCategory(category);
return Result.success();
}
@At
@SLog(tag = "商品分类", msg = "修改商品分类")
// @SaCheckPermission("mall.category.manage")
public Result updateCategory(@Valid MallCategoryVO category) {
int count = dao.count(MallCategory.class, Cnd.where(MallCategory::getId, "=", category.getId()));
if (count == 0) {
return Result.error("该分类不存在");
}
//判断父分类与子分类的状态是否一致
if (category.getParentId() != null && !"0".equals(category.getParentId())) {
MallCategory parentCategory = dao.fetch(MallCategory.class, Cnd.where(MallCategory::getId, "=", category.getParentId()));
if (!parentCategory.getDelFlag().equals(category.getDelFlag())) {
return Result.error("父分类与子分类状态不一致");
}
}
dao.update(category);
return Result.success();
}
@At
@SLog(tag = "商品分类", msg = "删除商品分类")
// @SaCheckPermission("mall.category.manage")
public Result delAllByIds(@Valid String id) {
MallCategory category = new MallCategory();
category.setParentId(id);
Cnd cnd = Cnd.NEW();
cnd.andEX("level", "=", category.getLevel());
cnd.andEX("name", "=", category.getName());
cnd.andEX("parentId", "=", category.getParentId());
cnd.andEX("id", "<>", category.getId());
cnd.andEX("delFlag", "=", false);
cnd.asc("sortOrder");
List<MallCategory> list = dao.query(MallCategory.class, cnd);
if (Lang.isNotEmpty(list)) {
return Result.error("此类别下存在子类别不能删除");
}
// int count = dao.count(MallGoods.class, Cnd.where(MallGoods::getCategoryPath, "=", category.getId()).and(MallGoods::getDelFlag, "=", false));
// if (count > 0) {
// return Result.error("此类别下存在商品不能删除");
// }
dao.clear(MallCategory.class, Cnd.where(MallCategory::getId, "=", id));
return Result.success();
}
@At
@SLog(tag = "商品分类", msg = "后台 禁用/启用 分类")
// @SaCheckPermission("mall.category.manage")
public Result disable(@Valid String id, Boolean enableOperations){
int count = dao.count(MallCategory.class, Cnd.where(MallCategory::getId, "=", id));
if (count == 0) {
return Result.error("商品分类不存在");
}
categoryService.updateCategoryStatus(id, enableOperations);
return Result.success();
}
}
@@ -0,0 +1,31 @@
package com.budwk.app.zhgh.mall.controller.manage.goods;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
/**
* @version 1.0
* @Author zzr
* @nameMallGoodsStoreController
* @Date 2025/7/16 17:02
* @注释 商品仓库管理
*/
@IocBean
@Ok("json:full")
@At("/platform/mall/goods/manage")
public class MallGoodsManageController {
@Inject
private Dao dao;
@At("")
@Ok("beetl:/platform/zhgh/mall/goods/goodsManage.html")
// @SaCheckPermission("mall.goods.manage")
public void index() {
}
}
@@ -0,0 +1,67 @@
package com.budwk.app.zhgh.mall.controller.manage.goods;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.mall.models.dto.goods.MallGoodsOperationDTO;
import com.budwk.app.zhgh.mall.models.vo.goods.MallGoodsVO;
import com.budwk.app.zhgh.mall.service.goods.MallGoodsService;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Dao;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
/**
* @version 1.0
* @Author zzr
* @nameMallGoodsStoreController
* @Date 2025/7/16 17:09
* @注释 商品添加管理
*/
@IocBean
@Ok("json:full")
@At("/platform/mall/goods/store")
public class MallGoodsStoreController {
@Inject
private Dao dao;
@Inject
private MallGoodsService goodsService;
@At("")
// @SaCheckPermission("mall.goods.store")
@Ok("beetl:/platform/zhgh/mall/manage/goods/add/index.html")
public void index() {
}
@At
@Aop(TransAop.READ_COMMITTED)
// @SaCheckPermission("mall.goods.store")
@SLog(tag = "添加商品", msg = "商品名称:${args[0].goodsName}")
public Result save(@Valid MallGoodsOperationDTO goodsOperationDTO) {
goodsService.addGoods(goodsOperationDTO);
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
// @SaCheckPermission("mall.goods.store")
@SLog(tag = "修改商品", msg = "商品名称:${args[0].goodsName}")
public Result update(@Valid @Param("goodsOperationDTO") MallGoodsOperationDTO goodsOperationDTO, @Param("goodsId") String goodsId){
goodsService.editGoods(goodsOperationDTO, goodsId);
return Result.success();
}
@At
// @SaCheckPermission("mall.goods.store")
public Result getGoodsStoreById(@Valid String id){
MallGoodsVO goodsVO = goodsService.getGoodsVO(id);
return Result.success().addData(goodsVO);
}
}
@@ -1,187 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.dto;
import com.budwk.app.zhgh.mall.manage.models.goods.entity.GoodsGalleryDO;
import com.budwk.app.zhgh.mall.manage.models.goods.entity.GoodsParamsDO;
import com.budwk.app.zhgh.mall.manage.models.goods.vo.ExchangeVO;
import com.budwk.app.zhgh.mall.manage.models.goods.vo.GoodsMobileIntroVO;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import javax.validation.Valid;
import javax.validation.constraints.*;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* 商品vo
*
* @author fk
* @version v2.0
* @since v7.0.0
* 2018年3月21日 上午11:25:10
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class GoodsDTO implements Serializable {
@Serial
private static final long serialVersionUID = 3922135264669953741L;
@ApiModelProperty("商品id")
private Long goodsId;
@ApiModelProperty("分类id")
private Long categoryId;
/**
* 用作显示
*/
@ApiModelProperty("分类名称")
private String categoryName;
@ApiModelProperty("店铺分类id")
@Min(value = 0, message = "店铺分类值不正确")
private Long shopCatId;
@ApiModelProperty("品牌id")
private Long brandId;
@ApiModelProperty("商品名称")
@NotEmpty(message = "商品名称不能为空")
private String goodsName;
@ApiModelProperty("商品编号")
@Length(max = 30,message = "商品编号太长,不能超过30个字符")
private String sn;
@ApiModelProperty("商品价格")
@NotNull(message = "商品价格不能为空")
@Min(value = 0, message = "商品价格不能为负数")
@Max(value = 99999999, message = "商品价格不能超过99999999")
private Double price;
@ApiModelProperty("成本价格")
@NotNull(message = "成本价格不能为空")
@Min(value = 0, message = "成本价格不能为负数")
@Max(value = 99999999, message = "成本价格不能超过99999999")
private Double cost;
@ApiModelProperty("市场价格")
@NotNull(message = "市场价格不能为空")
@Min(value = 0, message = "市场价格不能为负数")
@Max(value = 99999999, message = "市场价格不能超过99999999")
private Double mktprice;
@ApiModelProperty("重量")
@NotNull(message = "商品重量不能为空")
@Min(value = 0, message = "重量不能为负数")
@Max(value = 99999999,message = "重量不能超过99999999")
private Double weight;
@ApiModelProperty("谁承担运费0:买家承担,1:卖家承担")
@NotNull(message = "承担运费不能为空")
@Min(value = 0, message = "承担运费值不正确")
@Max(value = 1, message = "承担运费值不正确")
private Integer goodsTransfeeCharge;
@ApiModelProperty("详情")
private String intro;
@ApiModelProperty("是否有规格0没有1有")
private Integer haveSpec;
@ApiModelProperty("库存")
@Max(value = 99999999, message = "库存不能超过99999999")
private Integer quantity;
@ApiModelProperty("是否上架,1上架 0下架")
@Min(value = 0, message = "是否上架值不正确")
@Max(value = 1, message = "是否上架值不正确")
private Integer marketEnable;
@ApiModelProperty("商品参数")
@Valid
private List<GoodsParamsDO> goodsParamsList;
@ApiModelProperty("商品相册")
@NotNull(message = "商品相册图片不能为空")
@Size(min = 1,message = "商品相册图片不能为空")
private List<GoodsGalleryDO> goodsGalleryList;
@ApiModelProperty("积分兑换对象,不是积分兑换商品可以不传")
private ExchangeVO exchange;
@ApiModelProperty("sku数据变化或者组合变化判断 0:没变化,1:变化")
private Integer hasChanged;
@ApiModelProperty("seo标题")
private String pageTitle;
@ApiModelProperty("seo关键字")
private String metaKeywords;
@ApiModelProperty("seo描述")
private String metaDescription;
@ApiModelProperty("商品的评论数量")
private Integer commentNum;
@ApiModelProperty("运费模板id,不需要运费模板时值是0")
private Long templateId;
@ApiModelProperty("商品是否审核")
private Integer isAuth;
@ApiModelProperty("可用库存")
private Integer enableQuantity;
@ApiModelProperty("商品移动端详情数据集合")
private List<GoodsMobileIntroVO> introList;
@ApiModelProperty("商品视频")
private String goodsVideo;
@Override
public String toString() {
return "GoodsDTO{" +
"goodsId=" + goodsId +
", categoryId=" + categoryId +
", categoryName='" + categoryName + '\'' +
", shopCatId=" + shopCatId +
", brandId=" + brandId +
", goodsName='" + goodsName + '\'' +
", sn='" + sn + '\'' +
", price=" + price +
", cost=" + cost +
", mktprice=" + mktprice +
", weight=" + weight +
", goodsTransfeeCharge=" + goodsTransfeeCharge +
", intro='" + intro + '\'' +
", haveSpec=" + haveSpec +
", quantity=" + quantity +
", marketEnable=" + marketEnable +
", goodsParamsList=" + goodsParamsList +
", goodsGalleryList=" + goodsGalleryList +
", exchange=" + exchange +
", hasChanged=" + hasChanged +
", pageTitle='" + pageTitle + '\'' +
", metaKeywords='" + metaKeywords + '\'' +
", metaDescription='" + metaDescription + '\'' +
", commentNum=" + commentNum +
", templateId=" + templateId +
", isAuth=" + isAuth +
", enableQuantity=" + enableQuantity +
", introList=" + introList +
", goodsVideo='" + goodsVideo + '\'' +
'}';
}
}
@@ -1,64 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.entity;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Data;
import org.nutz.dao.entity.annotation.*;
import java.io.Serial;
import java.io.Serializable;
/**
* 品牌实体
*
* @author fky
*
*/
@Data
@Table("mall_brand")
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class BrandDO implements Serializable {
@Serial
private static final long serialVersionUID = 9122931201151887L;
/**
* 主键
*/
@Id
@Column
@Comment("id")
@ColDefine(customType = "bigint")
private Long brandId;
/**
* 品牌名称
*/
@Column
@Comment("品牌名称")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String name;
/**
* 品牌图标
*/
@Column
@Comment("品牌图标")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String logo;
/**
* 是否删除,0删除1未删除
*/
@Column
@Comment("是否删除")
@ColDefine(type = ColType.INT)
private Integer disabled;
@Override
public String toString() {
return "[brandId=" + brandId + ", name=" + name + ", logo=" + logo + ", disabled=" + disabled + "]";
}
}
@@ -1,66 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.entity;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.nutz.dao.entity.annotation.*;
import java.io.Serial;
import java.io.Serializable;
/**
* 分类品牌关联表实体
*
* @author fky
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Comment("分类品牌关联表实体")
@Table("mall_category_brand")
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class CategoryBrandDO implements Serializable {
@Serial
private static final long serialVersionUID = 3315719881926878L;
/**
* 分类id
*/
@Id
@Column
@Comment("id")
@ColDefine(customType = "bigint")
private Long id;
/**
* 分类id
*/
@Column
@Comment("分类id")
@ColDefine(customType = "bigint")
private Long categoryId;
/**
* 品牌id
*/
@Column
@Comment("品牌id")
@ColDefine(customType = "bigint")
private Long brandId;
public CategoryBrandDO(Long categoryId, Long brandId) {
super();
this.categoryId = categoryId;
this.brandId = brandId;
}
@Override
public String toString() {
return "CategoryBrandDO [categoryId=" + categoryId + ", brandId=" + brandId + "]";
}
}
@@ -1,151 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.entity;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Data;
import org.nutz.dao.entity.annotation.*;
import javax.validation.constraints.NotEmpty;
import java.io.Serial;
import java.io.Serializable;
import java.util.Objects;
/**
* 商品分类实体
*
* @author fky
*
*/
@Data
@Comment("商品分类实体")
@Table("mall_category")
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class CategoryDO implements Serializable {
@Serial
private static final long serialVersionUID = 1964321416223565L;
/**
* 主键
*/
@Id
@Column
@Comment("id")
@ColDefine(customType = "bigint")
private Long categoryId;
/**
* 分类名称
*/
@Column
@Comment("分类名称")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String name;
/**
* 分类父id
*/
@Column
@Comment("分类父id,顶级0")
@ColDefine(customType = "bigint")
private Long parentId;
/**
* 分类父子路径
*/
@Column
@Comment("分类父子路径")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String categoryPath;
/**
* 该分类下商品数量
*/
@Column
@Comment("该分类下商品数量")
@ColDefine(type = ColType.INT)
private Integer goodsCount;
/**
* 分类排序
*/
@Column
@Comment("分类排序")
@ColDefine(type = ColType.INT)
private Integer categoryOrder;
/**
* 分类图标
*/
@Column
@Comment("分类图标")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String image;
/**
* 是否显示 YES:是,NO:否
*/
@Column
@Comment("是否显示 YES:是,NO:否")
@ColDefine(type = ColType.VARCHAR, width = 10)
private String isShow;
/**
* 分类广告图片
*/
@Column
@Comment("分类广告图片")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String advImage;
/**
* 分类广告图片链接
*/
@Column
@Comment("分类广告图片链接")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String advImageLink;
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
CategoryDO that = (CategoryDO) o;
return Objects.equals(categoryId, that.categoryId) &&
Objects.equals(name, that.name) &&
Objects.equals(parentId, that.parentId) &&
Objects.equals(categoryPath, that.categoryPath) &&
Objects.equals(goodsCount, that.goodsCount) &&
Objects.equals(categoryOrder, that.categoryOrder) &&
Objects.equals(image, that.image) &&
Objects.equals(isShow, that.isShow) &&
Objects.equals(advImage, that.advImage) &&
Objects.equals(advImageLink, that.advImageLink);
}
@Override
public int hashCode() {
return Objects.hash(categoryId, name, parentId, categoryPath, goodsCount, categoryOrder, image, isShow, advImage, advImageLink);
}
@Override
public String toString() {
return "CategoryDO{" +
"categoryId=" + categoryId +
", name='" + name + '\'' +
", parentId=" + parentId +
", categoryPath='" + categoryPath + '\'' +
", goodsCount=" + goodsCount +
", categoryOrder=" + categoryOrder +
", image='" + image + '\'' +
", isShow='" + isShow + '\'' +
", advImage='" + advImage + '\'' +
", advImageLink='" + advImageLink + '\'' +
'}';
}
}
@@ -1,63 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.entity;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.nutz.dao.entity.annotation.*;
import java.io.Serial;
import java.io.Serializable;
/**
* 分类规格关联表实体
*
* @author fky
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table("mall_category_spec")
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class CategorySpecDO implements Serializable {
@Serial
private static final long serialVersionUID = 3127259064985991L;
@Id
@Column
@Comment("id")
@ColDefine(customType = "bigint")
private Long id;
/**
* 分类id
*/
@Column
@Comment("分类id")
@ColDefine(customType = "bigint")
private Long categoryId;
/**
* 规格id
*/
@Column
@Comment("规格id")
@ColDefine(customType = "bigint")
private Long specId;
public CategorySpecDO(Long categoryId, Long specId) {
super();
this.categoryId = categoryId;
this.specId = specId;
}
@Override
public String toString() {
return "CategorySpecDO [categoryId=" + categoryId + ", specId=" + specId + "]";
}
}
@@ -1,307 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.entity;
import cn.hutool.json.JSONUtil;
import com.budwk.app.zhgh.mall.manage.models.goods.dto.GoodsDTO;
import com.budwk.app.zhgh.mall.manage.models.goods.enums.GoodsType;
import com.budwk.app.zhgh.mall.manage.models.goods.vo.GoodsMobileIntroVO;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.nutz.dao.entity.annotation.*;
import java.io.Serializable;
import java.util.List;
/**
* 草稿商品实体
*
* @author fky
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table("mall_draft_goods")
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class DraftGoodsDO implements Serializable {
private static final long serialVersionUID = 7646662730625878L;
/**
* 草稿商品id
*/
@Id
@Column
@Comment("id")
@ColDefine(customType = "bigint")
private Long draftGoodsId;
/**
* 商品编号
*/
@Column
@Comment("商品编号")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String sn;
/**
* 商品名称
*/
@Column
@Comment("商品名称")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String goodsName;
/**
* 商品品牌ID
*/
@Column
@Comment("商品品牌ID")
@ColDefine(customType = "bigint")
private Long brandId;
/**
* 商品分类ID
*/
@Column
@Comment("商品分类ID")
@ColDefine(customType = "bigint")
private Long categoryId;
/**
* 商品重量
*/
@Column
@Comment("商品重量")
@ColDefine(type = ColType.DOUBLE)
private Double weight;
/**
* 商品详情
*/
@Column
@Comment("商品详情")
@ColDefine(type = ColType.MYSQL_JSON)
private String intro;
/**
* 商品价格
*/
@Column
@Comment("商品价格")
@ColDefine(type = ColType.DOUBLE)
private Double price;
/**
* 商品成本价
*/
@Column
@Comment("商品成本价")
@ColDefine(type = ColType.DOUBLE)
private Double cost;
/**
* 商品市场价
*/
@Column
@Comment("商品市场价")
@ColDefine(type = ColType.DOUBLE)
private Double mktprice;
/**
* 商品类型
*/
@Column
@Comment("商品类型")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String goodsType;
/**
* 是否开启规格
*/
@Column
@Comment("是否开启规格")
@ColDefine(type = ColType.INT)
private Integer haveSpec;
/**
* 商品添加时间
*/
@Column
@Comment("商品添加时间")
@ColDefine(customType = "bigint")
private Long createTime;
/**
* 商品总库存
*/
@Column
@Comment("商品总库存")
@ColDefine(type = ColType.INT)
private Integer quantity;
/**
* 商品原始图片
*/
@Column
@Comment("商品原始图片")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String original;
/**
* 商品所属卖家ID
*/
@Column
@Comment("商品所属卖家ID")
@ColDefine(customType = "bigint")
private Long sellerId;
/**
* 商品所属店铺类目ID
*/
@Column
@Comment("商品所属店铺类目ID")
@ColDefine(customType = "bigint")
private Long shopCatId;
/**
* 商品运费模板ID
*/
@Column
@Comment("商品运费模板ID")
@ColDefine(customType = "bigint")
private Long templateId;
/**
* 是否为买家承担运费
*/
@Column
@Comment("是否为买家承担运费")
@ColDefine(type = ColType.INT)
private Integer goodsTransfeeCharge;
/**
* 商品所属店铺名称
*/
@Column
@Comment("商品所属店铺名称")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String sellerName;
/**
* seo 标题
*/
@Column
@Comment("seo 标题")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String pageTitle;
/**
* seo关键字
*/
@Column
@Comment("seo关键字")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String metaKeywords;
/**
* seo描述
*/
@Column
@Comment("seo描述")
@ColDefine(type = ColType.MYSQL_JSON)
private String metaDescription;
/**
* 积分商品需要的金额
*/
@Column
@Comment("积分商品需要的金额")
@ColDefine(type = ColType.DOUBLE)
private Double exchangeMoney;
/**
* 积分商品需要的积分
*/
@Column
@Comment("积分商品需要的积分")
@ColDefine(type = ColType.INT)
private Integer exchangePoint;
/**
* 积分商品的分类id
*/
@Column
@Comment("积分商品的分类id")
@ColDefine(customType = "bigint")
private Long exchangeCategoryId;
/**
* 商品移动端详情
*/
@Column
@Comment("商品移动端详情")
@ColDefine(type = ColType.MYSQL_JSON)
private String mobileIntro;
/**
* 商品视频
*/
@Column
@Comment("商品视频")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String goodsVideo;
private List<String> galleryList;
public DraftGoodsDO(GoodsDTO goodsVO) {
this.draftGoodsId = goodsVO.getGoodsId();
this.categoryId = goodsVO.getCategoryId();
this.shopCatId = goodsVO.getShopCatId();
this.brandId = goodsVO.getBrandId();
this.goodsName = goodsVO.getGoodsName();
this.sn = goodsVO.getSn();
this.price = goodsVO.getPrice() == null ? 0 : goodsVO.getPrice();
this.cost = goodsVO.getCost() == null ? 0 : goodsVO.getCost();
this.mktprice = goodsVO.getMktprice() == null ? 0 : goodsVO.getMktprice();
this.weight = goodsVO.getWeight() == null ? 0 : goodsVO.getWeight();
this.goodsTransfeeCharge = goodsVO.getGoodsTransfeeCharge();
this.intro = goodsVO.getIntro();
this.haveSpec = goodsVO.getHaveSpec();
if (goodsVO.getExchange() != null && goodsVO.getExchange().getEnableExchange() == 1) {
this.goodsType = GoodsType.POINT.name();
this.exchangeMoney = goodsVO.getExchange().getExchangeMoney();
this.exchangePoint = goodsVO.getExchange().getExchangePoint();
this.exchangeCategoryId = goodsVO.getExchange().getCategoryId();
} else {
this.goodsType = GoodsType.NORMAL.name();
this.exchangeMoney = 0.00;
this.exchangePoint = 0;
this.exchangeCategoryId = 1L;
}
this.pageTitle = goodsVO.getPageTitle();
this.metaKeywords = goodsVO.getMetaKeywords();
this.metaDescription = goodsVO.getMetaDescription();
this.templateId = goodsVO.getTemplateId();
List<GoodsMobileIntroVO> introList = goodsVO.getIntroList();
if (introList != null && !introList.isEmpty()) {
this.mobileIntro = JSONUtil.toJsonStr(introList);
}
this.goodsVideo = goodsVO.getGoodsVideo();
}
@Override
public String toString() {
return "DraftGoodsDO{" +
"draftGoodsId=" + draftGoodsId +
", sn='" + sn + '\'' +
", goodsName='" + goodsName + '\'' +
", brandId=" + brandId +
", categoryId=" + categoryId +
", weight=" + weight +
", intro='" + intro + '\'' +
", price=" + price +
", cost=" + cost +
", mktprice=" + mktprice +
", goodsType='" + goodsType + '\'' +
", haveSpec=" + haveSpec +
", createTime=" + createTime +
", quantity=" + quantity +
", original='" + original + '\'' +
", sellerId=" + sellerId +
", shopCatId=" + shopCatId +
", templateId=" + templateId +
", goodsTransfeeCharge=" + goodsTransfeeCharge +
", sellerName='" + sellerName + '\'' +
", pageTitle='" + pageTitle + '\'' +
", metaKeywords='" + metaKeywords + '\'' +
", metaDescription='" + metaDescription + '\'' +
", exchangeMoney=" + exchangeMoney +
", exchangePoint=" + exchangePoint +
", exchangeCategoryId=" + exchangeCategoryId +
", mobileIntro='" + mobileIntro + '\'' +
", goodsVideo='" + goodsVideo + '\'' +
", galleryList=" + galleryList +
'}';
}
}
@@ -1,80 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.entity;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.nutz.dao.entity.annotation.*;
import java.io.Serial;
import java.io.Serializable;
/**
* 草稿商品参数表实体
*
* @author fky
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table("mall_draft_goods_params")
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class DraftGoodsParamsDO implements Serializable {
@Serial
private static final long serialVersionUID = 1137617128769441L;
/**
* ID
*/
@Id
@Column
@Comment("id")
@ColDefine(customType = "bigint")
private Long id;
/**
* 草稿ID
*/
@Column
@Comment("草稿id")
@ColDefine(customType = "bigint")
private Long draftGoodsId;
/**
* 参数ID
*/
@Column
@Comment("参数id")
@ColDefine(customType = "bigint")
private Long paramId;
/**
* 参数名
*/
@Column
@Comment("参数名")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String paramName;
/**
* 参数值
*/
@Column
@Comment("参数值")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String paramValue;
public DraftGoodsParamsDO(GoodsParamsDO param) {
this.paramId = param.getParamId();
this.paramName = param.getParamName();
this.paramValue = param.getParamValue();
}
@Override
public String toString() {
return "DraftGoodsParamsDO [id=" + id + ", draftGoodsId=" + draftGoodsId + ", paramId=" + paramId
+ ", paramName=" + paramName + ", paramValue=" + paramValue + "]";
}
}
@@ -1,106 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.entity;
import com.budwk.app.zhgh.mall.manage.models.goods.vo.GoodsSkuVO;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Data;
import org.nutz.dao.entity.annotation.*;
import java.io.Serial;
import java.io.Serializable;
/**
* 草稿商品sku实体
*
* @author fky
*
*/
@Data
@Table("mall_draft_goods_sku")
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class DraftGoodsSkuDO implements Serializable {
@Serial
private static final long serialVersionUID = 5684194304207265L;
/**
* 主键ID
*/
@Id
@Column
@Comment("id")
@ColDefine(customType = "bigint")
private Long draftSkuId;
/**
* 草稿id
*/
@Column
@Comment("草稿id")
@ColDefine(customType = "bigint")
private Long draftGoodsId;
/**
* 货号
*/
@Column
@Comment("货号")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String sn;
/**
* 总库存
*/
@Column
@Comment("货号")
@ColDefine(type = ColType.VARCHAR, width = 50)
private Integer quantity;
/**
* 价格
*/
@Column
@Comment("货号")
@ColDefine(type = ColType.VARCHAR, width = 50)
private Double price;
/**
* 规格
*/
@Column
@Comment("货号")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String specs;
/**
* 成本
*/
@Column
@Comment("货号")
@ColDefine(type = ColType.VARCHAR, width = 50)
private Double cost;
/**
* 重量
*/
@Column
@Comment("货号")
@ColDefine(type = ColType.VARCHAR, width = 50)
private Double weight;
public DraftGoodsSkuDO() {
}
public DraftGoodsSkuDO(GoodsSkuVO skuVO) {
this.setDraftGoodsId(skuVO.getGoodsId());
this.setSn(skuVO.getSn());
this.setPrice(skuVO.getPrice());
this.setCost(skuVO.getCost());
this.setWeight(skuVO.getWeight());
this.setQuantity(skuVO.getQuantity());
this.setSpecs(skuVO.getSpecs());
}
@Override
public String toString() {
return "DraftGoodsSkuDO [draftSkuId=" + draftSkuId + ", draftGoodsId=" + draftGoodsId + ", sn=" + sn
+ ", quantity=" + quantity + ", price=" + price + ", specs=" + specs + ", cost=" + cost + ", weight="
+ weight + "]";
}
}
@@ -1,481 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.entity;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.budwk.app.zhgh.mall.manage.models.goods.dto.GoodsDTO;
import com.budwk.app.zhgh.mall.manage.models.goods.vo.GoodsMobileIntroVO;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.nutz.dao.entity.annotation.*;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
import java.util.Objects;
/**
* 商品实体
*
* @author fky
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table("mall_goods")
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class GoodsDO implements Serializable {
@Serial
private static final long serialVersionUID = 9115135430405642L;
/**
* 主键
*/
@Id
@Column
@Comment("id")
@ColDefine(customType = "bigint")
private Long goodsId;
/**
* 商品名称
*/
@Column
@Comment("商品名称")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String goodsName;
/**
* 商品编号
*/
@Column
@Comment("商品编号")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String sn;
/**
* 品牌id
*/
@Column
@Comment("品牌id")
@ColDefine(customType = "bigint")
private Long brandId;
/**
* 分类id
*/
@Column
@Comment("分类id")
@ColDefine(customType = "bigint")
private Long categoryId;
/**
* 商品类型normal普通point积分
*/
@Column
@Comment("商品类型NORMAL普通POINT积分")
@ColDefine(type = ColType.VARCHAR, width = 120)
private String goodsType;
/**
* 重量
*/
@Column
@Comment("重量")
@ColDefine(type = ColType.DOUBLE)
private Double weight;
/**
* 上架状态 1上架 0下架
*/
@Column
@Comment("上架状态 1上架 0下架")
@ColDefine(type = ColType.INT)
private Integer marketEnable;
/**
* 详情
*/
@Column
@Comment("详情")
@ColDefine(type = ColType.MYSQL_JSON)
private String intro;
/**
* 商品价格
*/
@Column
@Comment("商品价格")
@ColDefine(type = ColType.DOUBLE)
private Double price;
/**
* 成本价格
*/
@Column
@Comment("成本价格")
@ColDefine(type = ColType.DOUBLE)
private Double cost;
/**
* 市场价格
*/
@Column
@Comment("市场价格")
@ColDefine(type = ColType.DOUBLE)
private Double mktprice;
/**
* 是否有规格0没有 1有
*/
@Column
@Comment("是否有规格0没有 1有")
@ColDefine(type = ColType.INT)
private Integer haveSpec;
/**
* 创建时间
*/
@Column
@Comment("创建时间")
@ColDefine(customType = "bigint")
private Long createTime;
/**
* 最后修改时间
*/
@Column
@Comment("最后修改时间")
@ColDefine(customType = "bigint")
private Long lastModify;
/**
* 浏览数量
*/
@Column
@Comment("浏览数量")
@ColDefine(type = ColType.INT)
private Integer viewCount;
/**
* 购买数量
*/
@Column
@Comment("购买数量")
@ColDefine(type = ColType.INT)
private Integer buyCount;
/**
* 是否被删除0 删除 1未删除
*/
@Column
@Comment("是否被删除0 删除 1未删除")
@ColDefine(type = ColType.INT)
private Integer disabled;
/**
* 库存
*/
@Column
@Comment("库存")
@ColDefine(type = ColType.INT)
private Integer quantity;
/**
* 可用库存
*/
@Column
@Comment("可用库存")
@ColDefine(type = ColType.INT)
private Integer enableQuantity;
/**
* 如果是积分商品需要使用的积分
*/
@Column
@Comment("如果是积分商品需要使用的积分")
@ColDefine(type = ColType.INT)
private Integer point;
/**
* seo标题
*/
@Column
@Comment("seo标题")
@ColDefine(type = ColType.VARCHAR, width = 120)
private String pageTitle;
/**
* seo关键字
*/
@Column
@Comment("seo关键字")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String metaKeywords;
/**
* seo描述
*/
@Column
@Comment("seo描述")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String metaDescription;
/**
* 商品好评率
*/
@Column
@Comment("商品好评率")
@ColDefine(type = ColType.DOUBLE)
private Double grade;
/**
* 缩略图路径
*/
@Column
@Comment("缩略图路径")
@ColDefine(type = ColType.VARCHAR, width = 120)
private String thumbnail;
/**
* 大图路径
*/
@Column
@Comment("大图路径")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String big;
/**
* 小图路径
*/
@Column
@Comment("小图路径")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String small;
/**
* 原图路径
*/
@Column
@Comment("原图路径")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String original;
/**
* 卖家id
*/
@Column
@Comment("卖家id")
@ColDefine(customType = "bigint")
private Long sellerId;
/**
* 店铺分类id
*/
@Column
@Comment("店铺分类id")
@ColDefine(customType = "bigint")
private Long shopCatId;
/**
* 评论数量
*/
@Column
@Comment("评论数量")
@ColDefine(type = ColType.INT)
private Integer commentNum;
/**
* 运费模板id
*/
@Column
@Comment("运费模板id")
@ColDefine(customType = "bigint")
private Long templateId;
/**
* 谁承担运费0:买家承担,1:卖家承担
*/
@Column
@Comment("谁承担运费0:买家承担,1:卖家承担")
@ColDefine(type = ColType.INT)
private Integer goodsTransfeeCharge;
/**
* 卖家名字
*/
@Column
@Comment("卖家名字")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String sellerName;
/**
* 0 需要审核 并且待审核,1 不需要审核 2需要审核 且审核通过 3 需要审核 且审核未通过
*/
@Column
@Comment("0 待审核,1 审核通过 2 未通过")
@ColDefine(type = ColType.INT)
private Integer isAuth;
/**
* 审核信息
*/
@Column
@Comment("审核信息")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String authMessage;
/**
* 下架原因
*/
@Column
@Comment("下架原因")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String underMessage;
@Column
@Comment("是否自营0否 1是")
@ColDefine(type = ColType.INT)
private Integer selfOperated;
/**
* 商品移动端详情
*/
@Column
@Comment("商品移动端详情")
@ColDefine(type = ColType.MYSQL_JSON)
private String mobileIntro;
/**
* 商品视频
*/
@Column
@Comment("商品视频")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String goodsVideo;
/**
* 搜索优先级
*/
@Column
@Comment("搜索优先级")
@ColDefine(type = ColType.INT)
private Integer priority;
@JsonIgnore
protected String scanRounds;
public GoodsDO(GoodsDTO goodsVO) {
this.goodsId = goodsVO.getGoodsId();
this.categoryId = goodsVO.getCategoryId();
this.shopCatId = goodsVO.getShopCatId();
this.brandId = goodsVO.getBrandId();
this.goodsName = goodsVO.getGoodsName();
this.sn = goodsVO.getSn();
this.price = goodsVO.getPrice();
this.cost = goodsVO.getCost();
this.mktprice = goodsVO.getMktprice();
this.weight = goodsVO.getWeight();
this.goodsTransfeeCharge = goodsVO.getGoodsTransfeeCharge();
this.intro = goodsVO.getIntro();
this.haveSpec = goodsVO.getHaveSpec();
this.templateId = goodsVO.getTemplateId();
this.pageTitle = goodsVO.getPageTitle();
this.metaKeywords = goodsVO.getMetaKeywords();
this.metaDescription = goodsVO.getMetaDescription();
this.marketEnable = goodsVO.getMarketEnable() != 1 ? 0 : 1;
if (StrUtil.isNotBlank(this.pageTitle)) {
this.pageTitle = goodsVO.getGoodsName();
}
if (StrUtil.isNotBlank(this.metaKeywords)) {
this.metaKeywords = goodsVO.getGoodsName();
}
if (StrUtil.isNotBlank(this.metaDescription)) {
this.metaDescription = goodsVO.getGoodsName();
}
List<GoodsMobileIntroVO> introList = goodsVO.getIntroList();
if (introList != null && introList.size() != 0) {
this.mobileIntro = JSONUtil.toJsonStr(introList);
} else {
this.mobileIntro = "";
}
this.goodsVideo = goodsVO.getGoodsVideo();
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
GoodsDO goodsDO = (GoodsDO) o;
return Objects.equals(goodsId, goodsDO.goodsId) &&
Objects.equals(goodsName, goodsDO.goodsName) &&
Objects.equals(sn, goodsDO.sn) &&
Objects.equals(brandId, goodsDO.brandId) &&
Objects.equals(categoryId, goodsDO.categoryId) &&
Objects.equals(goodsType, goodsDO.goodsType) &&
Objects.equals(weight, goodsDO.weight) &&
Objects.equals(marketEnable, goodsDO.marketEnable) &&
Objects.equals(intro, goodsDO.intro) &&
Objects.equals(price, goodsDO.price) &&
Objects.equals(cost, goodsDO.cost) &&
Objects.equals(mktprice, goodsDO.mktprice) &&
Objects.equals(haveSpec, goodsDO.haveSpec) &&
Objects.equals(createTime, goodsDO.createTime) &&
Objects.equals(lastModify, goodsDO.lastModify) &&
Objects.equals(viewCount, goodsDO.viewCount) &&
Objects.equals(buyCount, goodsDO.buyCount) &&
Objects.equals(disabled, goodsDO.disabled) &&
Objects.equals(quantity, goodsDO.quantity) &&
Objects.equals(enableQuantity, goodsDO.enableQuantity) &&
Objects.equals(point, goodsDO.point) &&
Objects.equals(pageTitle, goodsDO.pageTitle) &&
Objects.equals(metaKeywords, goodsDO.metaKeywords) &&
Objects.equals(metaDescription, goodsDO.metaDescription) &&
Objects.equals(grade, goodsDO.grade) &&
Objects.equals(thumbnail, goodsDO.thumbnail) &&
Objects.equals(big, goodsDO.big) &&
Objects.equals(small, goodsDO.small) &&
Objects.equals(original, goodsDO.original) &&
Objects.equals(sellerId, goodsDO.sellerId) &&
Objects.equals(shopCatId, goodsDO.shopCatId) &&
Objects.equals(commentNum, goodsDO.commentNum) &&
Objects.equals(templateId, goodsDO.templateId) &&
Objects.equals(goodsTransfeeCharge, goodsDO.goodsTransfeeCharge) &&
Objects.equals(sellerName, goodsDO.sellerName) &&
Objects.equals(isAuth, goodsDO.isAuth) &&
Objects.equals(authMessage, goodsDO.authMessage) &&
Objects.equals(underMessage, goodsDO.underMessage) &&
Objects.equals(selfOperated, goodsDO.selfOperated) &&
Objects.equals(mobileIntro, goodsDO.mobileIntro) &&
Objects.equals(goodsVideo, goodsDO.goodsVideo);
}
@Override
public int hashCode() {
return Objects.hash(goodsId, goodsName, sn, brandId, categoryId, goodsType, weight, marketEnable, intro, price, cost, mktprice, haveSpec, createTime, lastModify, viewCount, buyCount, disabled, quantity, enableQuantity, point, pageTitle, metaKeywords, metaDescription, grade, thumbnail, big, small, original, sellerId, shopCatId, commentNum, templateId, goodsTransfeeCharge, sellerName, isAuth, authMessage, underMessage, selfOperated, mobileIntro, goodsVideo);
}
@Override
public String toString() {
return "GoodsDO{" +
"goodsId=" + goodsId +
", goodsName='" + goodsName + '\'' +
", sn='" + sn + '\'' +
", brandId=" + brandId +
", categoryId=" + categoryId +
", goodsType='" + goodsType + '\'' +
", weight=" + weight +
", marketEnable=" + marketEnable +
", intro='" + intro + '\'' +
", price=" + price +
", cost=" + cost +
", mktprice=" + mktprice +
", haveSpec=" + haveSpec +
", createTime=" + createTime +
", lastModify=" + lastModify +
", viewCount=" + viewCount +
", buyCount=" + buyCount +
", disabled=" + disabled +
", quantity=" + quantity +
", enableQuantity=" + enableQuantity +
", point=" + point +
", pageTitle='" + pageTitle + '\'' +
", metaKeywords='" + metaKeywords + '\'' +
", metaDescription='" + metaDescription + '\'' +
", grade=" + grade +
", thumbnail='" + thumbnail + '\'' +
", big='" + big + '\'' +
", small='" + small + '\'' +
", original='" + original + '\'' +
", sellerId=" + sellerId +
", shopCatId=" + shopCatId +
", commentNum=" + commentNum +
", templateId=" + templateId +
", goodsTransfeeCharge=" + goodsTransfeeCharge +
", sellerName='" + sellerName + '\'' +
", isAuth=" + isAuth +
", authMessage='" + authMessage + '\'' +
", underMessage='" + underMessage + '\'' +
", selfOperated=" + selfOperated +
", mobileIntro='" + mobileIntro + '\'' +
", goodsVideo='" + goodsVideo + '\'' +
'}';
}
}
@@ -1,101 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.entity;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.nutz.dao.entity.annotation.*;
import java.io.Serializable;
/**
* 商品相册实体
*
* @author fky
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table("mall_goods_gallery")
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class GoodsGalleryDO implements Serializable {
private static final long serialVersionUID = 8150217189133447L;
/**
* 主键
*/
@Id
@Column
@Comment("图片的主键id")
@ColDefine(customType = "bigint")
private Long imgId;
/**
* 商品主键
*/
@Column
@Comment("商品主键")
@ColDefine(customType = "bigint")
private Long goodsId;
/**
* 缩略图路径
*/
@Column
@Comment("缩略图路径")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String thumbnail;
/**
* 小图路径
*/
@Column
@Comment("小图路径")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String small;
/**
* 大图路径
*/
@Column
@Comment("大图路径")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String big;
/**
* 原图路径
*/
@Column
@Comment("原图路径")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String original;
/**
* 极小图路径
*/
@Column
@Comment("极小图路径")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String tiny;
/**
* 是否是默认图片1 0没有默认
*/
@Column
@Comment("是否是默认图片1 0没有默认")
@ColDefine(type = ColType.INT)
private Integer isdefault;
/**
* 排序
*/
@Column
@Comment("排序")
@ColDefine(type = ColType.INT)
private Integer sort;
@Override
public String toString() {
return "GoodsGalleryDO [imgId=" + imgId + ", goodsId=" + goodsId + ", thumbnail=" + thumbnail + ", small="
+ small + ", big=" + big + ", original=" + original + ", tiny=" + tiny + ", isdefault=" + isdefault
+ ", sort=" + sort + "]";
}
}
@@ -1,79 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.entity;
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import org.nutz.dao.entity.annotation.*;
import java.io.Serializable;
/**
* 商品关联参数值实体
*
* @author fky
*
*/
@Data
@Table("mall_goods_params")
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class GoodsParamsDO implements Serializable {
private static final long serialVersionUID = 4134870721776090L;
/**
* 主键
*/
@Id
@Column
@Comment("id")
@ColDefine(customType = "bigint")
private Long id;
/**
* 商品id
*/
@Column
@Comment("商品id")
@ColDefine(customType = "bigint")
private Long goodsId;
/**
* 参数id
*/
@Column
@Comment("参数id")
@ColDefine(customType = "bigint")
private Long paramId;
/**
* 参数名字
*/
@Column
@Comment("参数名字")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String paramName;
/**
* 参数值
*/
@Column
@Comment("参数值")
@ColDefine(type = ColType.VARCHAR, width = 120)
@Length(max = 100, message = "参数值字符不能大于120")
private String paramValue;
public String getParamValue() {
if (StrUtil.isNotBlank(paramValue)) {
return "";
}
return paramValue;
}
@Override
public String toString() {
return "GoodsParamsDO [id=" + id + ", goodsId=" + goodsId + ", paramId=" + paramId + ", paramName=" + paramName
+ ", paramValue=" + paramValue + "]";
}
}
@@ -1,225 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.entity;
import cn.hutool.core.builder.EqualsBuilder;
import cn.hutool.core.builder.HashCodeBuilder;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.nutz.dao.entity.annotation.*;
import javax.validation.constraints.Max;
import java.io.Serial;
import java.io.Serializable;
/**
* 商品sku实体
*
* @author fky
*
*/
@Data
@Table("mall_goods_sku")
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class GoodsSkuDO implements Serializable {
@Serial
private static final long serialVersionUID = 5102510694003249L;
/**
* 主键
*/
@Id
@Column
@Comment("id")
@ColDefine(customType = "bigint")
private Long skuId;
/**
* 商品id
*/
@Column
@Comment("商品id")
@ColDefine(customType = "bigint")
private Long goodsId;
/**
* 商品名称
*/
@Column
@Comment("商品名称")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String goodsName;
/**
* 商品编号
*/
@Column
@Comment("商品编号")
@ColDefine(type = ColType.VARCHAR, width = 30)
@Length(max = 30,message = "商品规格编号太长,不能超过30个字符")
private String sn;
/**
* 库存
*/
@Column
@Comment("库存")
@ColDefine(type = ColType.INT)
@Max(value = 99999999, message = "库存不能超过99999999")
private Integer quantity;
/**
* 可用库存
*/
@Column
@Comment("可用库存")
@ColDefine(type = ColType.INT)
private Integer enableQuantity;
/**
* 商品价格
*/
@Column
@Comment("商品价格")
@ColDefine(type = ColType.DOUBLE)
@Max(value = 99999999, message = "价格不能超过99999999")
private Double price;
/**
* 规格信息json
*/
@Column
@Comment("规格信息json")
@ColDefine(type = ColType.MYSQL_JSON)
private String specs;
/**
* 成本价格
*/
@Column
@Comment("成本价格")
@ColDefine(type = ColType.DOUBLE)
@Max(value = 99999999, message = "成本价格不能超过99999999")
private Double cost;
/**
* 重量
*/
@Column
@Comment("重量")
@ColDefine(type = ColType.DOUBLE)
@Max(value = 99999999, message = "重量不能超过99999999")
private Double weight;
/**
* 卖家id
*/
@Column
@Comment("卖家id")
@ColDefine(customType = "bigint")
private Long sellerId;
/**
* 卖家名称
*/
@Column
@Comment("卖家名称")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String sellerName;
/**
* 分类id
*/
@Column
@Comment("分类id")
@ColDefine(customType = "bigint")
private Long categoryId;
/**
* 缩略图
*/
@Column
@Comment("缩略图")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String thumbnail;
@Column
@Comment("hash_code")
@ColDefine(type = ColType.INT)
private Integer hashCode;
/**
* 运费模板ID(非数据库字段)
*/
private Long templateId;
@JsonIgnore
protected String scanRounds;
@Override
public String toString() {
return "GoodsSkuDO{" +
"skuId=" + skuId +
", goodsId=" + goodsId +
", goodsName='" + goodsName + '\'' +
", sn='" + sn + '\'' +
", quantity=" + quantity +
", enableQuantity=" + enableQuantity +
", price=" + price +
", specs='" + specs + '\'' +
", cost=" + cost +
", weight=" + weight +
", sellerId=" + sellerId +
", sellerName='" + sellerName + '\'' +
", categoryId=" + categoryId +
", thumbnail='" + thumbnail + '\'' +
", hashCode=" + hashCode +
", templateId=" + templateId +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
GoodsSkuDO that = (GoodsSkuDO) o;
return new EqualsBuilder()
.append(getSkuId(), that.getSkuId())
.append(getGoodsId(), that.getGoodsId())
.append(getGoodsName(), that.getGoodsName())
.append(getSn(), that.getSn())
.append(getQuantity(), that.getQuantity())
.append(getEnableQuantity(), that.getEnableQuantity())
.append(getPrice(), that.getPrice())
.append(getSpecs(), that.getSpecs())
.append(getCost(), that.getCost())
.append(getWeight(), that.getWeight())
.append(getSellerId(), that.getSellerId())
.append(getSellerName(), that.getSellerName())
.append(getCategoryId(), that.getCategoryId())
.append(getThumbnail(), that.getThumbnail())
.append(hashCode, that.hashCode)
.append(getTemplateId(), that.getTemplateId())
.isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder(17, 37)
.append(getSkuId())
.append(getGoodsId())
.append(getGoodsName())
.append(getSn())
.append(getQuantity())
.append(getEnableQuantity())
.append(getPrice())
.append(getSpecs())
.append(getCost())
.append(getWeight())
.append(getSellerId())
.append(getSellerName())
.append(getCategoryId())
.append(getThumbnail())
.append(hashCode)
.append(getTemplateId())
.toHashCode();
}
}
@@ -1,64 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.entity;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.nutz.dao.entity.annotation.*;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
/**
* 参数组实体
*
* @author fky
*
*/
@Data
@Table("mall_parameter_group")
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class ParameterGroupDO implements Serializable {
private static final long serialVersionUID = 2394621849767871L;
/**
* 主键
*/
@Id
@Column
@Comment("id")
@ColDefine(customType = "bigint")
private Long groupId;
/**
* 参数组名称
*/
@Column
@Comment("参数组名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
@NotEmpty(message = "参数组名称不能为空")
@Length(max = 50, message = "参数组名称不能超过50字")
private String groupName;
/**
* 关联分类id
*/
@Column
@Comment("关联分类id")
@ColDefine(customType = "bigint")
private Long categoryId;
/**
* 排序
*/
@Column
@Comment("id")
@ColDefine(type = ColType.INT)
private Integer sort;
@Override
public String toString() {
return "ParameterGroupDO [groupId=" + groupId + ", groupName=" + groupName + ", categoryId=" + categoryId
+ ", sort=" + sort + "]";
}
}
@@ -1,113 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.entity;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.nutz.dao.entity.annotation.*;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* 参数实体
*
* @author fky
*
*/
@Data
@Table("mall_parameters")
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class ParametersDO implements Serializable {
private static final long serialVersionUID = 320610453789555L;
/**
* 主键
*/
@Id
@Column
@Comment("id")
@ColDefine(customType = "bigint")
private Long paramId;
/**
* 参数名称
*/
@Column
@Comment("参数名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
@NotEmpty(message = "参数名称必填")
@Length(max = 50, message = "参数名称不能超过50字")
private String paramName;
/**
* 参数类型1 输入项 2 选择项
*/
@Column
@Comment("参数类型1 输入项 2 选择项")
@ColDefine(type = ColType.INT)
@NotNull(message = "参数类型必选")
@Min(value = 1,message = "参数类型传值不正确")
@Max(value = 2,message = "参数类型传值不正确")
private Integer paramType;
/**
* 选择值,当参数类型是选择项2时,必填,逗号分隔
*/
@Column
@Comment("选择值")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String options;
/**
* 是否可索引,0 不显示 1 显示
*/
@Column
@Comment("是否可索引必选")
@ColDefine(type = ColType.INT)
@NotNull(message = "是否可索引必选")
@Min(value = 0,message = "是否可索引传值不正确")
@Max(value = 1,message = "是否可索引传值不正确")
private Integer isIndex;
/**
* 是否必填是 1 否 0
*/
@Column
@Comment("是否必填")
@ColDefine(type = ColType.INT)
@NotNull(message = "是否必填必选")
@Min(value = 0,message = "是否必填传值不正确")
@Max(value = 1,message = "是否必填传值不正确")
private Integer required;
/**
* 参数分组id
*/
@Column
@Comment("参数分组id")
@ColDefine(customType = "bigint")
@NotNull(message = "所属参数组不能为空")
private Long groupId;
/**
* 分类id
*/
@Column
@Comment("分类id")
@ColDefine(customType = "bigint")
private Long categoryId;
/**
* 排序
*/
@Column
@Comment("参数组名称")
@ColDefine(type = ColType.INT)
private Integer sort;
@Override
public String toString() {
return "ParametersDO [paramId=" + paramId + ", paramName=" + paramName + ", paramType=" + paramType
+ ", options=" + options + ", isIndex=" + isIndex + ", required=" + required + ", groupId=" + groupId
+ ", categoryId=" + categoryId + ", sort=" + sort + "]";
}
}
@@ -1,153 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.entity;
import cn.hutool.core.builder.EqualsBuilder;
import cn.hutool.core.builder.HashCodeBuilder;
import com.budwk.app.zhgh.mall.manage.models.goods.vo.GoodsQuantityVO;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.nutz.dao.entity.annotation.*;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import java.io.Serial;
import java.io.Serializable;
/**
* 库存日志表实体
*
* @author fky
*
*/
@Data
@NoArgsConstructor
@Table("mall_quantity_log")
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class QuantityLog implements Serializable {
@Serial
private static final long serialVersionUID = 6427256120262393L;
/**
* 日志id
*/
@Id
@Column
@Comment("id")
@ColDefine(customType = "bigint")
private Long logId;
/**
* 订单编号
*/
@Column
@Comment("订单编号")
@ColDefine(type = ColType.VARCHAR, width = 100)
@NotEmpty(message = "订单编号不能为空")
private String orderSn;
/**
* 商品id
*/
@Column
@Comment("商品id")
@ColDefine(customType = "bigint")
@NotEmpty(message = "商品id不能为空")
private Long goodsId;
/**
* sku id
*/
@Column
@Comment("sku id")
@ColDefine(customType = "bigint")
private Long skuId;
/**
* 库存数
*/
@Column
@Comment("库存数")
@ColDefine(type = ColType.INT)
@NotEmpty(message = "库存数不能为空")
private Integer quantity;
/**
* 可用库存
*/
@Column
@Comment("可用库存")
@ColDefine(type = ColType.INT)
@Min(message = "必须为数字", value = 0)
private Integer enableQuantity;
/**
* 操作时间
*/
@Column
@Comment("操作时间")
@ColDefine(customType = "bigint")
private Long opTime;
@Column
@Comment("日志类型")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String logType;
@Column
@Comment("原因")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String reason;
public QuantityLog(GoodsQuantityVO goodsQuantity) {
this.skuId = goodsQuantity.getSkuId();
this.quantity = goodsQuantity.getQuantity();
this.goodsId = goodsQuantity.getGoodsId();
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
QuantityLog that = (QuantityLog) o;
return new EqualsBuilder()
.append(orderSn, that.orderSn)
.append(goodsId, that.goodsId)
.append(skuId, that.skuId)
.append(quantity, that.quantity)
.append(enableQuantity, that.enableQuantity)
.append(logType, that.logType)
.isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder(17, 37)
.append(orderSn)
.append(goodsId)
.append(skuId)
.append(quantity)
.append(enableQuantity)
.append(logType)
.toHashCode();
}
@Override
public String toString() {
return "QuantityLog{" +
"logId=" + logId +
", orderSn='" + orderSn + '\'' +
", goodsId=" + goodsId +
", skuId=" + skuId +
", quantity=" + quantity +
", enableQuantity=" + enableQuantity +
", opTime=" + opTime +
", logType='" + logType + '\'' +
'}';
}
}
@@ -1,78 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.entity;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.nutz.dao.entity.annotation.*;
import java.io.Serializable;
/**
* 规格值实体
*
* @author fky
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table("mall_spec_values")
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class SpecValuesDO implements Serializable {
private static final long serialVersionUID = 5356147177823233L;
/**
* 主键
*/
@Id
@Column
@Comment("规格值id")
@ColDefine(customType = "bigint")
private Long specValueId;
/**
* 规格项id
*/
@Column
@Comment("规格项id")
@ColDefine(customType = "bigint")
private Long specId;
/**
* 规格值名字
*/
@Column
@Comment("规格值名字")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String specValue;
/**
* 所属卖家
*/
@Column
@Comment("所属卖家")
@ColDefine(customType = "bigint")
private Long sellerId;
/**
* 规格名称
*/
@Column
@Comment("规格名称")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String specName;
public SpecValuesDO(Long specId, String specValue, Long sellerId) {
super();
this.specId = specId;
this.specValue = specValue;
this.sellerId = sellerId;
}
@Override
public String toString() {
return "SpecValuesDO [specValueId=" + specValueId + ", specId=" + specId + ", specValue=" + specValue
+ ", sellerId=" + sellerId + "]";
}
}
@@ -1,83 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.entity;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import org.nutz.dao.entity.annotation.*;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
/**
* 规格项实体
*
* @author fky
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table("mall_specification")
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class SpecificationDO implements Serializable {
private static final long serialVersionUID = 5111769180376075L;
/**
* 主键
*/
@Id
@Column
@Comment("id")
@ColDefine(customType = "bigint")
private Long specId;
/**
* 规格项名称
*/
@Column
@Comment("规格项名称")
@ColDefine(type = ColType.VARCHAR, width = 100)
@NotEmpty(message = "规格项名称不能为空")
private String specName;
/**
* 是否被删除0 删除 1 没有删除
*/
@Column
@Comment("参数名称")
@ColDefine(type = ColType.INT)
private Integer disabled;
/**
* 规格描述
*/
@Column
@Comment("规格描述")
@ColDefine(type = ColType.VARCHAR, width = 50)
@Length(max = 50, message = "规格备注为0到50个字符之间")
private String specMemo;
/**
* 所属卖家 0属于平台
*/
@Column
@Comment("所属卖家 0属于平台")
@ColDefine(customType = "bigint")
private Long sellerId;
public SpecificationDO(String specName, Integer disabled, String specMemo, Long sellerId) {
super();
this.specName = specName;
this.disabled = disabled;
this.specMemo = specMemo;
this.sellerId = sellerId;
}
@Override
public String toString() {
return "SpecificationDO [specId=" + specId + ", specName=" + specName + ", disabled=" + disabled + ", specMemo="
+ specMemo + ", sellerId=" + sellerId + "]";
}
}
@@ -1,64 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.entity;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.nutz.dao.entity.annotation.*;
import java.io.Serial;
import java.io.Serializable;
/**
* 标签商品关联实体
*
* @author fky
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table("mall_tag_goods")
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class TagGoodsDO implements Serializable {
@Serial
private static final long serialVersionUID = 9467335201085494L;
@Id
@Column
@Comment("规格值id")
@ColDefine(customType = "bigint")
private Long id;
/**
* 标签id
*/
@Column
@Comment("标签id")
@ColDefine(customType = "bigint")
private Long tagId;
/**
* 商品id
*/
@Column
@Comment("商品id")
@ColDefine(customType = "bigint")
private Long goodsId;
public TagGoodsDO(Long tagId, Long goodsId) {
super();
this.tagId = tagId;
this.goodsId = goodsId;
}
@Override
public String toString() {
return "TagGoodsDO{" +
"tagId=" + tagId +
", goodsId=" + goodsId +
'}';
}
}
@@ -1,76 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.entity;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.nutz.dao.entity.annotation.*;
import java.io.Serial;
import java.io.Serializable;
/**
* 商品标签实体
*
* @author fky
*
*/
@Data
@Table("mall_tags")
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class TagsDO implements Serializable {
@Serial
private static final long serialVersionUID = 1899720595535600L;
/**
* 主键
*/
@Id
@Column
@Comment("规格值id")
@ColDefine(customType = "bigint")
private Long tagId;
/**
* 标签名字
*/
@Column
@Comment("标签名字")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String tagName;
/**
* 所属卖家
*/
@Column
@Comment("所属卖家")
@ColDefine(customType = "bigint")
private Long sellerId;
/**
* 关键字
*/
@Column
@Comment("关键字")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String mark;
public TagsDO(String tagName, Long sellerId, String mark) {
super();
this.tagName = tagName;
this.sellerId = sellerId;
this.mark = mark;
}
@Override
public String toString() {
return "TagsDO{" +
"tagId=" + tagId +
", tagName='" + tagName + '\'' +
", sellerId=" + sellerId +
", mark='" + mark + '\'' +
'}';
}
}
@@ -1,25 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.enums;
/**
* 商品操作枚举
* @author fky
*/
public enum GoodsOperate {
/**
* 下架
*/
UNDER,
/**
* 还原
*/
REVRET,
/**
* 放入回收站
*/
RECYCLE,
/**
* 删除
*/
DELETE
}
@@ -1,23 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.enums;
/**
* 商品类型枚举
* @author fky
*/
public enum GoodsType {
/**
* 正常商品
*/
NORMAL("正常商品"),
/**
* 积分商品
*/
POINT("积分商品");
private String description;
GoodsType(String description) {
this.description = description;
}
}
@@ -1,30 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.enums;
/**
* 权限枚举
* @author fky
*/
public enum Permission {
/**
* 卖家权限
*/
SELLER,
/**
* 买家权限
*/
BUYER,
/**
* 管理员权限
*/
ADMIN,
/**
* 不验证权限
*/
CLIENT
}
@@ -1,33 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.enums;
/**
* 库存日志类型
* @author fky
*/
public enum QuantityLogType {
/**
* 订单创建扣减库存
*/
ORDER_CREATE,
/**
* 订单取消
*/
ORDER_CANCEL,
/**
* 库存回滚
*/
ROLLBACK,
/**
* 发货
*/
SHIP,
/**
* 退货
*/
RETURN
}
@@ -1,19 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.enums;
/**
* 库存数类型
* @author fky
*/
public enum QuantityType {
/**
* 实际的库存,包含了待发货的
*/
actual,
/**
* 可以售的库存,不包含待发货的
*/
enable
}
@@ -1,31 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.enums;
/**
* 缓存中库存类型
* 用于更新缓存等操作使用
* @author fky
*/
public enum StockType {
/**
* sku实际的库存,包含了待发货的
*/
SKU_STOCK_ACTUAL,
/**
* sku可以售的库存,不包含待发货的
*/
SKU_STOCK_ENABLE,
/**
* goods实际的库存,包含了待发货的
*/
GOODS_STOCK_ACTUAL,
/**
* goods可以售的库存,不包含待发货的
*/
GOODS_STOCK_ENABLE,
}
@@ -1,38 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.enums;
/**
* 标签类型
* @author fky
*/
public enum TagType {
/**
* 热卖排行
*/
HOT("hot","热卖排行"),
/**
* 新品推荐
*/
NEW("new","新品推荐"),
/**
* 推荐商品
*/
RECOMMEND("recommend","推荐商品");
private String mark;
private String tagName;
TagType(String mark,String tagName) {
this.mark = mark;
this.tagName = tagName;
}
public String mark(){
return this.mark;
}
public String tagName(){
return this.tagName;
}
}
@@ -1,48 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.vo;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
/**
* 商品的积分兑换信息
* @author fky
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class ExchangeVO implements Serializable{
@Serial
private static final long serialVersionUID = 4702156500500693965L;
/** 是否允许兑换 */
@ApiModelProperty("是否允许积分兑换")
private Integer enableExchange;
/** 兑换所需金额 */
@ApiModelProperty("兑换所需金额")
private Double exchangeMoney;
/** 商品所属积分分类 */
@ApiModelProperty("积分兑换所属分类")
private Long categoryId;
/** 兑换所需积分 */
@ApiModelProperty("积分兑换使用的积分")
private Integer exchangePoint;
@Override
public String toString() {
return "ExchangeVO [enableExchange=" + enableExchange + ", exchangeMoney=" + exchangeMoney + ", categoryId="
+ categoryId + ", exchangePoint=" + exchangePoint + "]";
}
}
@@ -1,64 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.vo;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Objects;
/**
* 商品移动端详情VO
* @author fky
*/
@Data
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class GoodsMobileIntroVO implements Serializable {
@Serial
private static final long serialVersionUID = 7556885109369605084L;
@ApiModelProperty("类型 text:文字,image:图片")
private String type;
@ApiModelProperty("内容")
private String content;
@ApiModelProperty("是否选中")
private Boolean checked;
@ApiModelProperty("是否选中编辑")
private Boolean editChecked;
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
GoodsMobileIntroVO that = (GoodsMobileIntroVO) o;
return Objects.equals(type, that.type) &&
Objects.equals(content, that.content) &&
Objects.equals(checked, that.checked) &&
Objects.equals(editChecked, that.editChecked);
}
@Override
public int hashCode() {
return Objects.hash(type, content, checked, editChecked);
}
@Override
public String toString() {
return "GoodsMobileIntroVO{" +
"type='" + type + '\'' +
", content='" + content + '\'' +
", checked=" + checked +
", editChecked=" + editChecked +
'}';
}
}
@@ -1,91 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.vo;
import cn.hutool.core.builder.EqualsBuilder;
import cn.hutool.core.builder.HashCodeBuilder;
import com.budwk.app.zhgh.mall.manage.models.goods.enums.QuantityType;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 商品库存vo
* @author fky
*/
@Data
@NoArgsConstructor
public class GoodsQuantityVO implements Cloneable{
private Long goodsId;
private Long skuId;
private Integer quantity;
private QuantityType quantityType;
public GoodsQuantityVO(Long goodsId, Long skuId, Integer quantity ) {
super();
this.goodsId = goodsId;
this.skuId = skuId;
this.quantity = quantity;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
public Integer getQuantity() {
if ( quantity==null){
return 0;
}
return quantity;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
GoodsQuantityVO that = (GoodsQuantityVO) o;
return new EqualsBuilder()
.append(goodsId, that.goodsId)
.append(skuId, that.skuId)
.append(quantity, that.quantity)
.append(quantityType, that.quantityType)
.isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder(17, 37)
.append(goodsId)
.append(skuId)
.append(quantity)
.append(quantityType)
.toHashCode();
}
@Override
public String toString() {
return "GoodsQuantityVO{" +
"goodsId=" + goodsId +
", skuId=" + skuId +
", quantity=" + quantity +
", quantityType=" + quantityType +
'}';
}
}
@@ -1,176 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.vo;
import cn.hutool.json.JSONUtil;
import com.budwk.app.zhgh.mall.manage.models.goods.entity.DraftGoodsSkuDO;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.Max;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* 商品sku
* @author fky
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class GoodsSkuVO implements Serializable {
@Serial
private static final long serialVersionUID = -666090547834195127L;
/**
* 主键
*/
@ApiModelProperty("sku表主键")
private Long skuId;
/**
* 商品id
*/
@ApiModelProperty("商品id")
private Long goodsId;
/**
* 商品名称
*/
@ApiModelProperty("商品名称")
private String goodsName;
/**
* 商品编号
*/
@ApiModelProperty("商品编号")
@Length(max = 30,message = "商品规格编号太长,不能超过30个字符")
private String sn;
/**
* 库存
*/
@ApiModelProperty("库存")
@Max(value = 99999999, message = "库存不能超过99999999")
private Integer quantity;
/**
* 可用库存
*/
@ApiModelProperty("可用库存")
private Integer enableQuantity;
/**
* 商品价格
*/
@ApiModelProperty("商品价格")
@Max(value = 99999999, message = "价格不能超过99999999")
private Double price;
/**
* 规格信息json
*/
@ApiModelProperty("规格信息json")
private String specs;
/**
* 成本价格
*/
@ApiModelProperty("成本价格")
@Max(value = 99999999, message = "成本价格不能超过99999999")
private Double cost;
/**
* 重量
*/
@ApiModelProperty("重量")
@Max(value = 99999999, message = "重量不能超过99999999")
private Double weight;
/**
* 卖家id
*/
@ApiModelProperty("卖家id")
private Long sellerId;
/**
* 卖家名称
*/
@ApiModelProperty("卖家名称")
private String sellerName;
/**
* 分类id
*/
@ApiModelProperty("分类id")
private Long categoryId;
/**
* 缩略图
*/
@ApiModelProperty("缩略图")
private String thumbnail;
@ApiModelProperty("hash_code")
private Integer hashCode;
/**
* 运费模板ID(非数据库字段)
*/
@ApiModelProperty("运费模板ID")
private Long templateId;
@JsonIgnore
protected String scanRounds;
@ApiModelProperty("规格列表")
private List<SpecValueVO> specList;
@ApiModelProperty("谁承担运费0:买家承担,1:卖家承担")
private Integer goodsTransfeeCharge;
@ApiModelProperty("是否被删除 0 删除 1 未删除")
private Integer disabled;
@ApiModelProperty("上架状态 0下架 1上架")
private Integer marketEnable;
@ApiModelProperty("商品类型NORMAL普通POINT积分")
private String goodsType;
@ApiModelProperty("最后修改时间")
private Long lastModify;
@ApiModelProperty("运费脚本")
private List<String> scripts;
public List<SpecValueVO> getSpecList() {
if (this.getSpecs() != null) {
return JSONUtil.toList(this.getSpecs(), SpecValueVO.class);
}
return specList;
}
public GoodsSkuVO(DraftGoodsSkuDO draftSku) {
this.setCost(draftSku.getCost());
this.setPrice(draftSku.getPrice());
this.setQuantity(draftSku.getQuantity());
this.setSkuId(draftSku.getDraftSkuId());
this.setSn(draftSku.getSn());
this.setWeight(draftSku.getWeight());
this.setSpecList(JSONUtil.toList(draftSku.getSpecs(), SpecValueVO.class));
}
@Override
public String toString() {
return "GoodsSkuVO{" +
"specList=" + specList +
", goodsTransfeeCharge=" + goodsTransfeeCharge +
", disabled=" + disabled +
", marketEnable=" + marketEnable +
", goodsType='" + goodsType + '\'' +
", lastModify=" + lastModify +
", scripts=" + scripts +
'}';
}
}
@@ -1,95 +0,0 @@
package com.budwk.app.zhgh.mall.manage.models.goods.vo;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 规格值实体
* @author fky
*/
@Data
@NoArgsConstructor
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class SpecValueVO implements Serializable {
/**
* 序列号
*/
private static final long serialVersionUID = 1426807099688672502L;
/**
* 主键
*/
@ApiModelProperty("规格值id")
private Long specValueId;
/**
* 规格项id
*/
@ApiModelProperty("规格项id")
private Long specId;
/**
* 规格值名字
*/
@ApiModelProperty("规格值名字")
private String specValue;
/**
* 所属卖家
*/
@ApiModelProperty("所属卖家")
private Long sellerId;
/**
* 规格名称
*/
@ApiModelProperty("规格名称")
private String specName;
/**
* 商品sku——id
*/
@ApiModelProperty("sku_id")
private Long skuId;
/**
* 商品大图
*/
@ApiModelProperty("商品大图")
private String big;
/**
* 商品小图
*/
@ApiModelProperty("商品小图")
private String small;
/**
* 商品缩略图
*/
@ApiModelProperty("商品缩略图")
private String thumbnail;
/**
* 商品极小图
*/
@ApiModelProperty("商品极小图")
private String tiny;
/**
* 规格类型,1图片 0 非图片
*/
@ApiModelProperty("该规格是否有图片,1 有 0 没有")
private Integer specType;
/**
* 规格图片
*/
@ApiModelProperty("规格的图片")
private String specImage;
@Override
public String toString() {
return "SpecValueVO [skuId=" + skuId + ", big=" + big + ", small=" + small + ", thumbnail=" + thumbnail
+ ", tiny=" + tiny + ", specType=" + specType + ", specImage=" + specImage + "]";
}
}
@@ -0,0 +1,71 @@
package com.budwk.app.zhgh.mall.models.dto.goods;
import cn.hutool.json.JSONObject;
import com.budwk.app.zhgh.mall.models.entity.goods.MallCategory;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameMallGoodsImportDTO
* @Date 2025/7/16 17:16
* @注释
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MallGoodsImportDTO {
@ApiModelProperty(value = "商品名称")
private String goodsName;
@ApiModelProperty(value = "商品卖点")
private String sellingPoint;
@ApiModelProperty(value = "商品分类")
private MallCategory category;
@ApiModelProperty(value = "运费模板")
private String template;
@ApiModelProperty(value = "计量单位")
private String goodsUnit;
@ApiModelProperty(value = "发布状态")
private Boolean release;
@ApiModelProperty(value = "商品图片")
private List<String> images;
private List<JSONObject> goodsGalleryFiles;
@ApiModelProperty(value = "成本价")
private Double cost;
@ApiModelProperty(value = "销售价")
private Double price;
@ApiModelProperty(value = "库存")
private Integer quantity;
@ApiModelProperty(value = "重量")
private Double weight;
@ApiModelProperty(value = "货号")
private String sn;
@ApiModelProperty(value = "详情")
private String intro;
@ApiModelProperty(value = "规格项")
private String skuKey;
@ApiModelProperty(value = "规格值")
private String skuValue;
}
@@ -0,0 +1,106 @@
package com.budwk.app.zhgh.mall.models.dto.goods;
import cn.hutool.json.JSONObject;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import org.hibernate.validator.constraints.Length;
import org.nutz.lang.util.NutMap;
import javax.validation.Valid;
import javax.validation.constraints.*;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameMallGoodsOperationDTO
* @Date 2025/7/16 17:13
* @注释
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MallGoodsOperationDTO implements Serializable {
@Serial
private static final long serialVersionUID = -509667581371776913L;
@ApiModelProperty(hidden = true)
private String goodsId;
@ApiModelProperty(value = "商品价格", required = true)
@NotNull(message = "商品价格不能为空")
@Min(value = 0, message = "商品价格不能为负数")
@Max(value = 99999999, message = "商品价格不能超过99999999")
private Double price;
@ApiModelProperty(value = "分类path")
private String categoryPath;
@ApiModelProperty(value = "商品名称", required = true)
@NotEmpty(message = "商品名称不能为空")
@Length(max = 50, message = "商品名称不能超过50个字符")
private String goodsName;
@ApiModelProperty(value = "详情")
private String intro;
@ApiModelProperty(value = "商品移动端详情")
private String mobileIntro;
@ApiModelProperty(value = "库存")
@Min(value = 0, message = "库存不能为负数")
@Max(value = 99999999, message = "库存不能超过99999999")
private Integer quantity;
@ApiModelProperty(value = "是否立即发布")
private Boolean release;
@ApiModelProperty(value = "是否是推荐商品")
private Boolean recommend;
@ApiModelProperty(value = "商品图片")
private List<JSONObject> goodsGalleryFiles;
@ApiModelProperty(value = "卖点")
private String sellingPoint;
@ApiModelProperty(value = "是否有规格", hidden = true)
private String haveSpec;
@ApiModelProperty(value = "商品描述")
private String info;
@ApiModelProperty(value = "是否重新生成sku数据")
private Boolean regeneratorSkuFlag = true;
@ApiModelProperty(value = "商品类型")
private String goodsType;
/**
* 商品视频
*/
@ApiModelProperty(value = "商品视频")
private String goodsVideo;
@ApiModelProperty(value = "sku列表")
@Valid
private List<NutMap> skuList;
@ApiModelProperty(value = "是否为商品模版")
private Boolean goodsTemplateFlag = false;
@ApiModelProperty(value = "注意事项")
private String needingAttention;
@ApiModelProperty(value = "浏览权限")
private String browsePermissions;
public String getGoodsName() {
return goodsName.replace(",", "");
}
}
@@ -0,0 +1,54 @@
package com.budwk.app.zhgh.mall.models.entity.goods;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.math.BigDecimal;
/**
* @version 1.0
* @Author zzr
* @nameMallCategory
* @Date 2025/7/15 15:59
* @注释
*/
@Data
@Table
@EqualsAndHashCode(callSuper = true)
public class MallCategory extends BaseModel {
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("分类名称")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String name;
@Column
@Comment("父id, 根节点为0")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String parentId;
@Column
@Comment("层级, 从0开始")
@ColDefine(type = ColType.INT)
private Integer level;
@Column
@Comment("排序值")
@ColDefine(type = ColType.INT)
private Integer sortOrder;
@Column
@Comment("分类图标")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String image;
}
@@ -0,0 +1,196 @@
package com.budwk.app.zhgh.mall.models.entity.goods;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.http.HtmlUtil;
import com.budwk.app.base.exception.BaseException;
import com.budwk.app.base.model.BaseModel;
import com.budwk.app.zhgh.mall.models.dto.goods.MallGoodsOperationDTO;
import com.budwk.app.zhgh.mall.models.enums.GoodsStatusEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.eclipse.jetty.util.StringUtil;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.util.Map;
/**
* @version 1.0
* @Author zzr
* @nameMallGoods
* @Date 2025/7/15 15:17
* @注释 商城商品
*/
@Data
@Table
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class MallGoods extends BaseModel {
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("商品名称")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String goodsName;
@Column
@Comment("商品价格")
@ColDefine(type = ColType.DOUBLE)
private Double price;
@Column
@Comment("分类path")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String categoryPath;
@Column
@Comment("计量单位")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String goodsUnit;
@Column
@Comment("卖点")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String sellingPoint;
@Column
@Comment("上架状态")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String marketEnable;
@Column
@Comment("pc端详情")
@ColDefine(type = ColType.TEXT)
private String intro;
@Column
@Comment("购买数量")
@ColDefine(type = ColType.INT)
private Integer buyCount;
@Column
@Comment("库存")
@ColDefine(type = ColType.INT)
private Integer quantity;
@Column
@Comment("商品好评率")
@ColDefine(type = ColType.DOUBLE)
private Double grade;
@Column
@Comment("缩略图路径")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String thumbnail;
@Column
@Comment("小图路径")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String small;
@Column
@Comment("原图路径")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String original;
@Column
@Comment("评论数量")
@ColDefine(type = ColType.INT)
private Integer commentNum;
@Column
@Comment("运费模板id")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String templateId;
@Column
@Comment("是否自营")
@ColDefine(type = ColType.BOOLEAN)
private Boolean selfOperated;
@Column
@Comment("商品移动端详情")
@ColDefine(type = ColType.TEXT)
private String mobileIntro;
@Column
@Comment("商品视频")
@ColDefine(type = ColType.VARCHAR)
private String goodsVideo;
@Column
@Comment("是否为推荐商品")
@ColDefine(type = ColType.BOOLEAN)
private Boolean recommend;
@Column
@Comment("商品类型")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String goodsType;
@Column
@Comment("商品参数json")
@ColDefine(type = ColType.MYSQL_JSON)
private String params;
public MallGoods(MallGoodsOperationDTO goodsOperationDTO) {
this.goodsName = goodsOperationDTO.getGoodsName();
this.categoryPath = goodsOperationDTO.getCategoryPath();
this.recommend = goodsOperationDTO.getRecommend();
this.sellingPoint = goodsOperationDTO.getSellingPoint();
this.intro = goodsOperationDTO.getIntro();
this.mobileIntro = goodsOperationDTO.getMobileIntro();
this.goodsVideo = goodsOperationDTO.getGoodsVideo();
this.price = goodsOperationDTO.getPrice();
//如果立即上架则
this.marketEnable = Boolean.TRUE.equals(goodsOperationDTO.getRelease()) ? GoodsStatusEnum.UPPER.name() : GoodsStatusEnum.DOWN.name();
this.goodsType = goodsOperationDTO.getGoodsType();
this.grade = 100D;
//循环sku,判定sku是否有效
for (Map<String, Object> sku : goodsOperationDTO.getSkuList()) {
//判定参数不能为空
if ((!sku.containsKey("price") || StringUtil.isEmpty(sku.get("price").toString()) || Convert.toDouble(sku.get("price")) <= 0)) {
throw new BaseException("商品SKU价格不能小于等于0");
}
// if ((!sku.containsKey("cost") || StringUtil.isEmpty(sku.get("cost").toString()) || Convert.toDouble(sku.get("cost")) <= 0)) {
// throw new BaseException("商品SKU成本价不能小于等于0");
// }
if (!sku.containsKey("quantity") || StringUtil.isEmpty(sku.get("quantity").toString()) || Convert.toInt(sku.get("quantity").toString()) < 0) {
throw new BaseException("商品库存数量不能为负数");
}
sku.values().forEach(i -> {
if (CharSequenceUtil.isBlank(i.toString())) {
throw new BaseException("规格值不能为空!");
}
});
}
}
public String getIntro() {
if (CharSequenceUtil.isNotEmpty(intro)) {
return HtmlUtil.unescape(intro);
}
return intro;
}
public String getMobileIntro() {
if (CharSequenceUtil.isNotEmpty(mobileIntro)) {
return HtmlUtil.unescape(mobileIntro);
}
return mobileIntro;
}
}
@@ -0,0 +1,210 @@
package com.budwk.app.zhgh.mall.models.entity.goods;
import com.budwk.app.base.model.BaseModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
/**
* @version 1.0
* @Author zzr
* @nameMallGoodsSku
* @Date 2025/7/15 17:33
* @注释 商品sku(库存)
*/
@Data
@Table
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class MallGoodsSku extends BaseModel {
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("商品id")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String goodsId;
@Column
@Comment("规格信息json")
@ColDefine(type = ColType.MYSQL_JSON)
private String specs;
@Column
@Comment("规格信息")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String simpleSpecs;
@Column
@Comment("配送模版id")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String freightTemplateId;
@Column
@Comment("商品名称")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String goodsName;
@Column
@Comment("商品编号")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String sn;
@Column
@Comment("分类path")
@ColDefine(type = ColType.TEXT)
private String categoryPath;
@Column
@Comment("计量单位")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String goodsUnit;
@Column
@Comment("卖点")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String sellingPoint;
@Column
@Comment("重量")
@ColDefine(type = ColType.DOUBLE)
private Double weight;
@Column
@Comment("上架状态")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String marketEnable;
@Column
@Comment("商品详情")
@ColDefine(type = ColType.TEXT)
private String intro;
@Column
@Comment("商品价格")
@ColDefine(type = ColType.DOUBLE)
private Double price;
@Column
@Comment("商品价格")
@ColDefine(type = ColType.INT)
private Integer viewCount;
@Column
@Comment("购买数量")
@ColDefine(type = ColType.INT)
private Integer buyCount;
@Column
@Comment("库存")
@ColDefine(type = ColType.INT)
private Integer quantity;
@Column
@Comment("商品好评率")
@ColDefine(type = ColType.DOUBLE)
private Double grade;
@Column
@Comment("缩略图路径")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String thumbnail;
@Column
@Comment("大图路径")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String big;
@Column
@Comment("小图路径")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String small;
@Column
@Comment("原图路径")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String original;
@Column
@Comment("评论数量")
@ColDefine(type = ColType.INT)
private Integer commentNum;
@Column
@Comment("运费模板id")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String templateId;
@Column
@Comment("商品移动端详情")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String mobileIntro;
@Column
@Comment("商品视频")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String goodsVideo;
@Column
@Comment("是否为推荐商品")
@ColDefine(type = ColType.BOOLEAN)
private Boolean recommend;
@Column
@Comment("商品类型")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String goodsType;
@ApiModelProperty(value = "预警数量")
@Column
@Comment("预警数量")
@ColDefine(type = ColType.INT)
private Integer alertQuantity;
public Double getWeight() {
if (weight == null) {
return 0d;
}
return weight;
}
public Integer getAlertQuantity() {
if(alertQuantity == null){
return 0;
}
return alertQuantity;
}
/**
* 设置规格商品的基本商品信息
*
* @param goods 基本商品信息
*/
public MallGoodsSku(MallGoods goods) {
//商品基本信息
this.goodsId = goods.getId();
this.goodsName = goods.getGoodsName();
this.goodsType = goods.getGoodsType();
this.goodsVideo = goods.getGoodsVideo();
this.sellingPoint = goods.getSellingPoint();
this.categoryPath = goods.getCategoryPath();
this.marketEnable = goods.getMarketEnable();
this.intro = goods.getIntro();
this.mobileIntro = goods.getMobileIntro();
this.goodsUnit = goods.getGoodsUnit();
this.grade = 100D;
this.alertQuantity = 0;
this.freightTemplateId = goods.getTemplateId();
this.recommend = goods.getRecommend();
}
}
@@ -0,0 +1,28 @@
package com.budwk.app.zhgh.mall.models.enums;
/**
* 商品类型枚举
*
* @author pikachu
* @since 2020-02-26 23:24:13
*/
public enum GoodsStatusEnum {
/**
* 上架
*/
UPPER("上架"),
/**
* 下架
*/
DOWN("下架");
private final String description;
GoodsStatusEnum(String description) {
this.description = description;
}
public String description() {
return description;
}
}
@@ -0,0 +1,32 @@
package com.budwk.app.zhgh.mall.models.enums;
/**
* 库存操作类型
*/
public enum GoodsStockTypeEnum {
SUB(""),
ADD("");
private final String description;
GoodsStockTypeEnum(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
// 根据描述获取枚举实例
public static GoodsStockTypeEnum fromDescription(String description) {
for (GoodsStockTypeEnum type : GoodsStockTypeEnum.values()) {
if (type.getDescription().equals(description)) {
return type;
}
}
throw new IllegalArgumentException("No matching enum constant for description: " + description);
}
}
@@ -0,0 +1,69 @@
package com.budwk.app.zhgh.mall.models.vo.goods;
import cn.hutool.core.bean.BeanUtil;
import com.budwk.app.zhgh.mall.models.entity.goods.MallCategory;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Comparator;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameMallCategoryVO
* @Date 2025/7/16 10:56
* @注释 分类VO
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MallCategoryVO {
@ApiModelProperty(value = "id")
private String id;
@ApiModelProperty(value = "分类名称")
private String name;
@ApiModelProperty(value = "父id, 根节点为0")
private String parentId;
@ApiModelProperty(value = "层级, 从0开始")
private Integer level;
@ApiModelProperty(value = "排序值")
private Integer sortOrder;
@ApiModelProperty(value = "图片名称")
private String image;
@ApiModelProperty(value = "父节点名称")
private String parentTitle;
@ApiModelProperty("子分类列表")
private List<MallCategoryVO> children;
@ApiModelProperty("删除标识")
private Boolean delFlag;
public MallCategoryVO(MallCategory category) {
BeanUtil.copyProperties(category, this);
}
public List<MallCategoryVO> getChildren() {
if (children != null) {
children.sort(new Comparator<MallCategoryVO>() {
@Override
public int compare(MallCategoryVO o1, MallCategoryVO o2) {
return o1.getSortOrder().compareTo(o2.getSortOrder());
}
});
return children;
}
return null;
}
}
@@ -0,0 +1,91 @@
package com.budwk.app.zhgh.mall.models.vo.goods;
import com.budwk.app.zhgh.mall.models.entity.goods.MallGoodsSku;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameMallGoodsVO
* @Date 2025/7/17 16:31
* @注释
*/
@Data
public class MallGoodsVO {
@ApiModelProperty(value = "id")
private String id;
@ApiModelProperty(value = "商品名称")
private String goodsName;
@ApiModelProperty(value = "商品价格")
private Double price;
@ApiModelProperty(value = "分类path")
private String categoryPath;
@ApiModelProperty(value = "计量单位")
private String goodsUnit;
@ApiModelProperty(value = "卖点")
private String sellingPoint;
@ApiModelProperty(value = "上架状态")
private String marketEnable;
@ApiModelProperty(value = "pc端详情")
private String intro;
@ApiModelProperty(value = "购买数量")
private Integer buyCount;
@ApiModelProperty(value = "库存")
private Integer quantity;
@ApiModelProperty(value = "商品好评率")
private Double grade;
@ApiModelProperty(value = "缩略图路径")
private String thumbnail;
@ApiModelProperty(value = "小图路径")
private String small;
@ApiModelProperty(value = "原图路径")
private String original;
@ApiModelProperty(value = "评论数量")
private Integer commentNum;
@ApiModelProperty(value = "运费模板id")
private String templateId;
@ApiModelProperty(value = "是否自营")
private Boolean selfOperated;
@ApiModelProperty(value = "商品移动端详情")
private String mobileIntro;
@ApiModelProperty(value = "商品视频")
private String goodsVideo;
@ApiModelProperty(value = "是否为推荐商品")
private Boolean recommend;
@ApiModelProperty(value = "商品类型")
private String goodsType;
@ApiModelProperty(value = "商品参数json")
private String params;
@ApiModelProperty(value = "分类名称")
private List<String> categoryName;
@ApiModelProperty(value = "sku列表")
private List<MallGoodsSku> skuList;
}
@@ -0,0 +1,38 @@
package com.budwk.app.zhgh.mall.param.goods;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* @version 1.0
* @Author zzr
* @nameMallCategorySearchParams
* @Date 2025/7/16 10:45
* @注释
*/
@Data
public class MallCategorySearchParams {
@ApiModelProperty(value = "分类名称")
private String name;
@ApiModelProperty(value = "父id")
private String parentId;
@ApiModelProperty(value = "层级")
private Integer level;
@ApiModelProperty(value = "排序值")
private BigDecimal sortOrder;
@ApiModelProperty(value = "佣金比例")
private BigDecimal commissionRate;
@ApiModelProperty(value = "父节点名称")
private String parentTitle;
@ApiModelProperty(value = "是否禁用")
private Boolean deleteFlag;
}
@@ -0,0 +1,25 @@
package com.budwk.app.zhgh.mall.service.goods;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.mall.models.entity.goods.MallCategory;
import com.budwk.app.zhgh.mall.param.goods.MallCategorySearchParams;
import com.budwk.app.zhgh.mall.models.vo.goods.MallCategoryVO;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameMallCategoryService
* @Date 2025/7/16 9:42
* @注释
*/
public interface MallCategoryService extends BaseService<MallCategory> {
void saveCategory(MallCategory category);
List<MallCategoryVO> listCategory(MallCategorySearchParams categorySearchParams);
void updateCategoryStatus(String id, Boolean enableOperations);
}
@@ -0,0 +1,46 @@
package com.budwk.app.zhgh.mall.service.goods;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.mall.models.dto.goods.MallGoodsOperationDTO;
import com.budwk.app.zhgh.mall.models.entity.goods.MallGoods;
import com.budwk.app.zhgh.mall.models.vo.goods.MallGoodsVO;
/**
* @version 1.0
* @Author zzr
* @nameMallGoodsService
* @Date 2025/7/16 17:03
* @注释
*/
public interface MallGoodsService extends BaseService<MallGoods> {
/**
* 添加商品
*
* @param goodsOperationDTO 商品查询条件
*/
void addGoods(MallGoodsOperationDTO goodsOperationDTO);
/**
* 修改商品
*
* @param goodsOperationDTO 商品查询条件
* @param goodsId 商品ID
*/
void editGoods(MallGoodsOperationDTO goodsOperationDTO, String goodsId);
/**
* 修改商品库存数量
*
* @param goodsId 商品ID
*/
void updateStock(String goodsId);
/**
* 查询商品VO
*
* @param goodsId 商品id
* @return 商品VO
*/
MallGoodsVO getGoodsVO(String goodsId);
}
@@ -0,0 +1,79 @@
package com.budwk.app.zhgh.mall.service.goods;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.mall.models.dto.goods.MallGoodsOperationDTO;
import com.budwk.app.zhgh.mall.models.entity.goods.MallGoods;
import com.budwk.app.zhgh.mall.models.entity.goods.MallGoodsSku;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameGoodsSkuService
* @Date 2025/7/16 18:05
* @注释
*/
public interface MallGoodsSkuService extends BaseService<MallGoodsSku> {
/**
* 添加商品sku
*
* @param goods 商品信息
* @param goodsOperationDTO 商品操作信息
*/
void add(MallGoods goods, MallGoodsOperationDTO goodsOperationDTO);
/**
* 更新商品sku
*
* @param goods 商品信息
* @param goodsOperationDTO 商品操作信息
*/
void update(MallGoods goods, MallGoodsOperationDTO goodsOperationDTO);
/**
* 获取最新商品库存
*
* @param goodsId 商品ID
* @return 库存数量
*/
Integer getGoodsStock(String goodsId);
/**
* 修改商品库存字段
*
* @param goodsSkus
*/
void updateGoodsStock(List<MallGoodsSku> goodsSkus);
/**
* 更新SKU库存
*
* @param skuId SKUId
* @param quantity 设置的库存数量
*/
void updateStock(String skuId, Integer quantity);
void updateStock(String skuId, Integer quantity,String type);
/**
* 批量渲染商品sku
*
* @param goodsSkuList SKU基础数据列表
* @param goodsOperationDTO 商品操作信息
*/
void renderGoodsSkuList(List<MallGoodsSku> goodsSkuList, MallGoodsOperationDTO goodsOperationDTO);
/**
* 获取goodsId下所有的goodsSku
*
* @param goodsId 商品id
* @return goodsSku列表
*/
List<MallGoodsSku> getGoodsListByGoodsId(String goodsId);
}
@@ -0,0 +1,129 @@
package com.budwk.app.zhgh.mall.service.impl.goods;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.zhgh.mall.models.entity.goods.MallCategory;
import com.budwk.app.zhgh.mall.param.goods.MallCategorySearchParams;
import com.budwk.app.zhgh.mall.service.goods.MallCategoryService;
import com.budwk.app.zhgh.mall.models.vo.goods.MallCategoryVO;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.IocBean;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameMallCategoryServiceImpl
* @Date 2025/7/16 10:27
* @注释
*/
@IocBean(args = {"refer:dao"})
public class MallCategoryServiceImpl extends BaseServiceImpl<MallCategory> implements MallCategoryService {
public MallCategoryServiceImpl(Dao dao) {
super(dao);
}
@Override
public void saveCategory(MallCategory category) {
if (category.getParentId() != null && !("0").equals(category.getParentId())) {
MallCategory parentCategory = dao().fetch(MallCategory.class, Cnd.where("id", "=", category.getParentId()));
category.setDelFlag(parentCategory.getDelFlag());
}
dao().insert(category);
}
@Override
public List<MallCategoryVO> listCategory(MallCategorySearchParams categorySearchParams) {
// 获取全部分类
List<MallCategory> list = dao().query(MallCategory.class, Cnd.where(MallCategory::getDelFlag, "=", false));
// 构造分类树
List<MallCategoryVO> categoryVOList = new ArrayList<>();
for (MallCategory category : list) {
if (("0").equals(category.getParentId())) {
MallCategoryVO categoryVO = new MallCategoryVO(category);
categoryVO.setChildren(findChildren(list, categoryVO));
categoryVOList.add(categoryVO);
}
}
categoryVOList.sort(Comparator.comparing(MallCategoryVO::getSortOrder));
return categoryVOList;
}
@Override
public void updateCategoryStatus(String id, Boolean enableOperations) {
//禁用子分类
MallCategoryVO categoryVO = new MallCategoryVO(dao().fetch(MallCategory.class, Cnd.where(MallCategory::getId, "=", id)));
List<String> ids = new ArrayList<>();
ids.add(categoryVO.getId());
this.findAllChild(categoryVO);
this.findAllChildIds(categoryVO, ids);
dao().update(MallCategory.class, Chain.make("delFlag", enableOperations), Cnd.where(MallCategory::getId, "in", ids));
}
/**
* 递归树形VO
*
* @param categories 分类列表
* @param categoryVO 分类VO
* @return 分类VO列表
*/
private List<MallCategoryVO> findChildren(List<MallCategory> categories, MallCategoryVO categoryVO) {
List<MallCategoryVO> children = new ArrayList<>();
categories.forEach(item -> {
if (item.getParentId().equals(categoryVO.getId())) {
MallCategoryVO temp = new MallCategoryVO(item);
temp.setChildren(findChildren(categories, temp));
children.add(temp);
}
});
return children;
}
/**
* 条件查询分类
*
* @param category 分类VO
*/
private void findAllChild(MallCategoryVO category) {
List<MallCategory> categories = dao().query(MallCategory.class, Cnd.where("parentId", "=", category.getId()));
List<MallCategoryVO> categoryVOList = new ArrayList<>();
for (MallCategory category1 : categories) {
categoryVOList.add(new MallCategoryVO(category1));
}
category.setChildren(categoryVOList);
if (!categoryVOList.isEmpty()) {
categoryVOList.forEach(this::findAllChild);
}
}
/**
* 获取所有的子分类ID
*
* @param category 分类
* @param ids ID列表
*/
private void findAllChildIds(MallCategoryVO category, List<String> ids) {
if (category.getChildren() != null && !category.getChildren().isEmpty()) {
for (MallCategoryVO child : category.getChildren()) {
ids.add(child.getId());
this.findAllChildIds(child, ids);
}
}
}
}
@@ -0,0 +1,144 @@
package com.budwk.app.zhgh.mall.service.impl.goods;
import com.budwk.app.base.exception.BaseException;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.zhgh.mall.models.dto.goods.MallGoodsOperationDTO;
import com.budwk.app.zhgh.mall.models.entity.goods.MallCategory;
import com.budwk.app.zhgh.mall.models.entity.goods.MallGoods;
import com.budwk.app.zhgh.mall.models.entity.goods.MallGoodsSku;
import com.budwk.app.zhgh.mall.models.vo.goods.MallGoodsVO;
import com.budwk.app.zhgh.mall.service.goods.MallCategoryService;
import com.budwk.app.zhgh.mall.service.goods.MallGoodsService;
import com.budwk.app.zhgh.mall.service.goods.MallGoodsSkuService;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.springframework.beans.BeanUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameMallGoodsServiceImpl
* @Date 2025/7/16 17:04
* @注释
*/
@Slf4j
@IocBean(args = {"refer:dao"})
public class MallGoodsServiceImpl extends BaseServiceImpl<MallGoods> implements MallGoodsService {
public MallGoodsServiceImpl(Dao dao) {
super(dao);
}
@Inject
private MallCategoryService categoryService;
@Inject
private MallGoodsSkuService goodsSkuService;
@Override
public void addGoods(MallGoodsOperationDTO goodsOperationDTO) {
MallGoods goods = new MallGoods(goodsOperationDTO);
// 判断商品信息
this.checkGoods(goods);
dao().insert(goods);
//添加商品sku信息
goodsSkuService.add(goods, goodsOperationDTO);
}
@Override
public void editGoods(MallGoodsOperationDTO goodsOperationDTO, String goodsId) {
MallGoods goods = new MallGoods(goodsOperationDTO);
goods.setId(goodsId);
//检查商品信息
this.checkGoods(goods);
//修改商品
dao().update(goods);
//修改商品sku信息
this.goodsSkuService.update(goods, goodsOperationDTO);
}
@Override
public void updateStock(String goodsId) {
Integer stock = goodsSkuService.getGoodsStock(goodsId);
dao().update(MallGoods.class, Chain.make("quantity", stock), Cnd.where("id", "=", goodsId));
}
@Override
public MallGoodsVO getGoodsVO(String goodsId) {
//查询商品信息
MallGoods goods = dao().fetch(MallGoods.class ,goodsId);
if (goods == null) {
log.error("商品ID为{}的商品不存在", goodsId);
throw new BaseException("商品不存在");
}
MallGoodsVO goodsVO = new MallGoodsVO();
//赋值
BeanUtils.copyProperties(goods, goodsVO);
//商品id
goodsVO.setId(goods.getId());
//商品sku赋值
List<MallGoodsSku> goodsListByGoodsId = goodsSkuService.getGoodsListByGoodsId(goodsId);
if (goodsListByGoodsId != null && !goodsListByGoodsId.isEmpty()) {
goodsVO.setSkuList(goodsListByGoodsId);
}
//商品分类名称赋值
List<String> categoryName = new ArrayList<>();
String categoryPath = goods.getCategoryPath();
String[] strArray = categoryPath.split(",");
List<MallCategory> categories = categoryService.dao().query(MallCategory.class, Cnd.where("id", "in", Arrays.asList(strArray)));
for (MallCategory category : categories) {
categoryName.add(category.getName());
}
goodsVO.setCategoryName(categoryName);
return goodsVO;
}
/**
* 检查商品
* @param goods 商品
*/
public void checkGoods(MallGoods goods){
// 判断是通过草稿加的还是手动新增
if (goods.getId() != null) {
// 如果有Id,就去判断库里面有没有
MallGoods sourceGoods = dao().fetch(MallGoods.class, Cnd.where("id", "=", goods.getId()));
if (sourceGoods == null) {
log.error("商品ID为{}的商品不存在", goods.getId());
throw new BaseException("商品不存在");
}
} else {
//评论次数
goods.setCommentNum(0);
//购买次数
goods.setBuyCount(0);
//购买次数
goods.setQuantity(0);
//商品评分
goods.setGrade(100.0);
}
}
/**
* 添加商品默认图片
*
* @param origin 图片
* @param goods 商品
*/
private void setGoodsGalleryParam(String origin, MallGoods goods) {
goods.setOriginal(origin);
goods.setSmall(origin);
goods.setThumbnail(origin);
}
}
@@ -0,0 +1,284 @@
package com.budwk.app.zhgh.mall.service.impl.goods;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.exception.BaseException;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.zhgh.mall.models.dto.goods.MallGoodsOperationDTO;
import com.budwk.app.zhgh.mall.models.entity.goods.MallGoods;
import com.budwk.app.zhgh.mall.models.entity.goods.MallGoodsSku;
import com.budwk.app.zhgh.mall.models.enums.GoodsStockTypeEnum;
import com.budwk.app.zhgh.mall.service.goods.MallGoodsService;
import com.budwk.app.zhgh.mall.service.goods.MallGoodsSkuService;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import java.util.*;
import java.util.stream.Collectors;
/**
* @version 1.0
* @Author zzr
* @nameMallGoodsSkuServiceImpl
* @Date 2025/7/16 18:05
* @注释
*/
@IocBean(args = {"refer:dao"})
public class MallGoodsSkuServiceImpl extends BaseServiceImpl<MallGoodsSku> implements MallGoodsSkuService {
public MallGoodsSkuServiceImpl(Dao dao) {
super(dao);
}
@Inject
private MallGoodsService goodsService;
@Override
public void add(MallGoods goods, MallGoodsOperationDTO goodsOperationDTO) {
// 是否存在规格
if (Lang.isEmpty(goodsOperationDTO.getSkuList())) {
throw new BaseException("规格必须填写!");
}
// 检查是否需要生成索引
List<MallGoodsSku> goodsSkus = buildBatch(goods, goodsOperationDTO.getSkuList());
renderGoodsSkuList(goodsSkus, goodsOperationDTO);
if (!goodsSkus.isEmpty()) {
dao().insertOrUpdate(goodsSkus);
this.updateGoodsStock(goodsSkus);
}
}
@Override
public void update(MallGoods goods, MallGoodsOperationDTO goodsOperationDTO) {
// 是否存在规格
if (Lang.isEmpty(goodsOperationDTO.getSkuList())) {
throw new BaseException("规格必须填写!");
}
List<MallGoodsSku> skuList = new ArrayList<>();
// 去遍历新的sku
for (Map<String, Object> skuInfo : goodsOperationDTO.getSkuList()) {
MallGoodsSku sku = new MallGoodsSku(goods);
builderSingle(sku, skuInfo);
renderGoodsSku(sku, goodsOperationDTO);
skuList.add(sku);
}
if (Lang.isNotEmpty(skuList)) {
Cnd cnd = Cnd.NEW();
cnd.and(MallGoodsSku::getGoodsId, "=", goods.getId());
List<String> ids = skuList.stream().map(MallGoodsSku::getId).filter(StrUtil::isNotBlank).toList();
if (Lang.isNotEmpty(ids)) {
cnd.and(MallGoodsSku::getId, "not in", ids);
}
// 删除旧sku
dao().clear(MallGoodsSku.class, cnd);
// 修改或新增sku
dao().insertOrUpdate(skuList);
// 请计算库存
updateGoodsStock(skuList);
}
}
@Override
public Integer getGoodsStock(String goodsId) {
Sql sql = Sqls.create("select id,quantity from mall_goods_sku where goodsId = @id").setParam("id", goodsId);
sql.setCallback(Sqls.callback.maps());
dao().execute(sql);
List<NutMap> skuInfos = (List<NutMap>) sql.getResult();
int stock = 0;
for (NutMap map : skuInfos) {
stock += map.getInt("quantity");
}
return stock;
}
@Override
@Aop(TransAop.READ_COMMITTED)
public void updateGoodsStock(List<MallGoodsSku> goodsSkus) {
Map<String, List<MallGoodsSku>> groupByGoodsIds = goodsSkus.stream().collect(Collectors.groupingBy(MallGoodsSku::getGoodsId));
//统计每个商品的库存
for (String goodsId : groupByGoodsIds.keySet()) {
//库存
Integer quantity = 0;
for (MallGoodsSku goodsSku : goodsSkus) {
if (goodsId.equals(goodsSku.getGoodsId())) {
quantity += goodsSku.getQuantity();
}
this.updateStock(goodsSku.getId(), goodsSku.getQuantity());
}
//保存商品库存结果
goodsService.updateStock(goodsId);
}
}
@Override
public void updateStock(String skuId, Integer quantity) {
MallGoodsSku goodsSku = dao().fetch(MallGoodsSku.class, skuId);
if (Lang.isNotEmpty(goodsSku)) {
goodsSku.setQuantity(quantity);
dao().update(MallGoodsSku.class, Chain.make("quantity", quantity), Cnd.where(MallGoodsSku::getId, "=", skuId));
}
}
@Override
public void updateStock(String skuId, Integer quantity, String type) {
MallGoodsSku goodsSku = dao().fetch(MallGoodsSku.class, skuId);
if (Lang.isNotEmpty(goodsSku)) {
//计算修改库存
if (type.equals(GoodsStockTypeEnum.ADD.name())) {
quantity = Convert.toInt(NumberUtil.add(goodsSku.getQuantity(), quantity));
} else {
quantity = Convert.toInt(NumberUtil.sub(goodsSku.getQuantity(), quantity));
}
goodsSku.setQuantity(quantity);
dao().update(MallGoodsSku.class, Chain.make("quantity", quantity), Cnd.where(MallGoodsSku::getId, "=", skuId));
}
}
/**
* 批量渲染商品sku
*
* @param goodsSkuList sku集合
* @param goodsOperationDTO 商品操作DTO
*/
@Override
public void renderGoodsSkuList(List<MallGoodsSku> goodsSkuList, MallGoodsOperationDTO goodsOperationDTO) {
// 商品销售模式渲染器
for (MallGoodsSku goodsSku : goodsSkuList) {
renderGoodsSku(goodsSku, goodsOperationDTO);
}
}
@Override
public List<MallGoodsSku> getGoodsListByGoodsId(String goodsId) {
return dao().query(MallGoodsSku.class, Cnd.where("goodsId", "=", goodsId));
}
/**
* 渲染商品sku
*
* @param goodsSku sku
* @param goodsOperationDTO 商品操作DTO
*/
void renderGoodsSku(MallGoodsSku goodsSku, MallGoodsOperationDTO goodsOperationDTO) {
extendOldSkuValue(goodsSku);
List<JSONObject> goodsImages = goodsOperationDTO.getGoodsGalleryFiles();
if (goodsImages == null || goodsImages.isEmpty()) {
return;
}
JSONObject jsonObject = JSONUtil.parseObj(goodsSku.getSpecs());
List<String> images = jsonObject.getBeanList("images", String.class);
String imageUrl = "";
if (Lang.isNotEmpty(images)) {
imageUrl = images.get(0);
} else {
imageUrl = goodsImages.get(0).getStr("url");
}
goodsSku.setBig(imageUrl);
goodsSku.setOriginal(imageUrl);
goodsSku.setThumbnail(imageUrl);
goodsSku.setSmall(imageUrl);
}
/**
* 将原sku的一些不会直接传递的值放到新的sku中
*
* @param goodsSku 商品sku
*/
private void extendOldSkuValue(MallGoodsSku goodsSku) {
if (StrUtil.isNotBlank(goodsSku.getGoodsId())) {
MallGoodsSku oldSku = dao().fetch(MallGoodsSku.class, Cnd.where(MallGoodsSku::getId, "=", goodsSku.getId()));
if (Lang.isNotEmpty(oldSku)) {
goodsSku.setCommentNum(oldSku.getCommentNum());
goodsSku.setViewCount(oldSku.getViewCount());
goodsSku.setBuyCount(oldSku.getBuyCount());
goodsSku.setGrade(oldSku.getGrade());
}
}
}
/**
* 批量构建商品sku
*
* @param goods 商品
* @return 商品sku
*/
public List<MallGoodsSku> buildBatch(MallGoods goods, List<NutMap> skuList) {
Assert.notEmpty(skuList, "skuList不能为空");
Assert.notNull(goods, "goods不能为空");
List<MallGoodsSku> goodsSkus = new ArrayList<>();
for (Map<String, Object> skuInfo : skuList) {
MallGoodsSku goodsSku = new MallGoodsSku(goods);
builderSingle(goodsSku, skuInfo);
goodsSkus.add(goodsSku);
}
return goodsSkus;
}
private static void builderSingle(MallGoodsSku goodsSku, Map<String, Object> skuInfo) {
Assert.notNull(goodsSku, "goodsSku不能为空");
Assert.notEmpty(skuInfo, "skuInfo不能为空");
//规格简短信息
StringBuilder simpleSpecs = new StringBuilder();
//商品名称
StringBuilder goodsName = new StringBuilder(goodsSku.getGoodsName());
//规格值
Map<String, Object> specMap = new LinkedHashMap<>();
// 原始规格项
String[] ignoreOriginKeys = {"id", "sn", "cost", "price", "quantity", "weight", "alertQuantity"};
//获取规格信息
for (Map.Entry<String, Object> spec : skuInfo.entrySet()) {
//保存新增规格信息
if (!CollUtil.contains(Arrays.asList(ignoreOriginKeys), spec.getKey()) && spec.getValue() != null) {
specMap.put(spec.getKey(), spec.getValue());
if (!"images".equals(spec.getKey())) {
//设置商品名称
goodsName.append(" ").append(spec.getValue());
//规格简短信息
simpleSpecs.append(" ").append(spec.getValue());
}
}
}
//设置规格信息
goodsSku.setGoodsName(goodsName.toString());
//规格信息
goodsSku.setId(Convert.toStr(skuInfo.get("id"), ""));
goodsSku.setSn(Convert.toStr(skuInfo.get("sn")));
goodsSku.setWeight(Convert.toDouble(skuInfo.get("weight"), 0D));
goodsSku.setPrice(Convert.toDouble(skuInfo.get("price"), 0D));
goodsSku.setQuantity(Convert.toInt(skuInfo.get("quantity"), 0));
goodsSku.setSpecs(JSONUtil.toJsonStr(specMap));
goodsSku.setSimpleSpecs(simpleSpecs.toString());
goodsSku.setAlertQuantity(Convert.toInt(skuInfo.get("alertQuantity"), 0));
}
}
@@ -1,18 +1,26 @@
package com.budwk.app.zhgh.staffbenefit.difficulthelp.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.staffbenefit.difficulthelp.models.DifficultHelpInfo;
import com.budwk.app.zhgh.staffbenefit.difficulthelp.service.DifficultHelpCommonService;
import com.budwk.app.zhgh.staffbenefit.difficulthelp.vo.DifficultHelpPageParam;
import com.budwk.app.zhgh.staffmanage.member.models.MemberChangeRecord;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
@@ -28,8 +36,11 @@ import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.Date;
import java.util.List;
/**
* @version 1.0
@@ -49,6 +60,8 @@ public class DifficultHelpApplyController {
@Inject
private FlowEngine flowEngine;
@Inject
private FlowCommonService flowCommonService;
@Inject
private DifficultHelpCommonService difficultHelpCommonService;
@At("")
@@ -65,55 +78,58 @@ public class DifficultHelpApplyController {
@At
@ApiOperation("困难补助申请,我的申请列表")
@SaCheckPermission("difficultHelp.apply")
public Result pageData(DifficultHelpPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.proxyUserName,
info.proxyLoginName,
info.userName,
info.loginName,
info.unitName,
info.unionName,
info.subsidyStandards,
info.applyTime,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariale,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke,
(SELECT MAX(id) FROM wf_process_task WHERE processInstanceId = ins.id AND taskName = 'startTask') AS startTaskId
FROM
difficult_help_info info
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
sql.setCondition(cnd);
Pagination<NutMap> pagination = difficultHelpCommonService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
@ApiOperation("保存申请")
@SaCheckPermission("member.apply.submit")
@SLog(tag = "困难补助申请", msg = "保存申请,填写人: ${args[0].proxyUserName}")
public Result save(@Param("data") DifficultHelpInfo difficultHelpInfo) {
difficultHelpInfo.setApplyTime(ObjectUtil.defaultIfNull(difficultHelpInfo.getApplyTime(), new Date()));
dao.insertOrUpdate(difficultHelpInfo);
return Result.success();
}
@At
@ApiOperation("提交申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.apply.submit")
@SLog(tag = "困难补助申请", msg = "提交申请,填写人: ${args[0].proxyUserName}")
public Result submit(@Param("data") DifficultHelpInfo difficultHelpInfo){
difficultHelpInfo.setApplyTime(new Date());
dao.insertOrUpdate(difficultHelpInfo);
// 开启流程实例
Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, difficultHelpInfo);
ProcessInstance instance = flowEngine.startProcessInstanceByKey("KNBF", difficultHelpInfo.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务
List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null);
for (ProcessTask task : doingTaskList) {
flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args);
}
return Result.success();
}
@At
@ApiOperation("重新提交申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.apply.submit")
@SLog(tag = "困难补助申请", msg = "重新提交申请,填写人: ${args[0].proxyUserName}")
public Result submitAgain(@Param("data") DifficultHelpInfo difficultHelpInfo, @Param("taskId") Long taskId) {
difficultHelpInfo.setApplyTime(ObjectUtil.defaultIfNull(difficultHelpInfo.getApplyTime(), new Date()));
dao.insertOrUpdate(difficultHelpInfo);
Dict dict = Dict.create();
dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
flowCommonService.executeTask(dict);
return Result.success();
}
@At
@ApiOperation("获取受助人")
@SaCheckPermission("difficultHelp.apply")
@@ -155,16 +171,4 @@ public class DifficultHelpApplyController {
return Result.success().addData(pagination.getList());
}
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("困难帮扶删除申请")
@SLog(tag = "困难帮扶申请", msg = "删除困难帮扶申请")
public Result onDelete(@Valid String id){
dao.clear(DifficultHelpInfo.class, Cnd.where("id", "=", id));
// 流程相关操作
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
return Result.success();
}
}
@@ -71,7 +71,8 @@ public class DifficultHelpBranchUnionApprovalController {
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariale,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
@@ -0,0 +1,127 @@
package com.budwk.app.zhgh.staffbenefit.difficulthelp.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.zhgh.staffbenefit.difficulthelp.models.DifficultHelpInfo;
import com.budwk.app.zhgh.staffbenefit.difficulthelp.service.DifficultHelpCommonService;
import com.budwk.app.zhgh.staffbenefit.difficulthelp.vo.DifficultHelpPageParam;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
/**
* @version 1.0
* @Author zzr
* @nameDifficultHelpViewController
* @Date 2025/7/31 11:50
* @注释
*/
@IocBean
@Ok("json")
@ApiOperation("困难补助查看")
@At("/platform/difficultHelp/mine")
public class DifficultHelpMineController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private DifficultHelpCommonService difficultHelpCommonService;
@At("")
@SaCheckPermission("difficultHelp.mine")
@Ok("beetl:/platform/zhgh/staffbenefit/difficulthelp/mine/index.html")
public void index() {
}
@At
@ApiOperation("困难补助申请,我的申请列表")
@SaCheckPermission("difficultHelp.mine")
public Result pageData(DifficultHelpPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.proxyUserName,
info.proxyLoginName,
info.userName,
info.loginName,
info.unitName,
info.unionName,
info.subsidyStandards,
info.applyTime,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke,
(select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask' AND taskState in (10,20)) AS startTaskId
FROM
difficult_help_info info
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
sql.setCondition(cnd);
Pagination<NutMap> pagination = difficultHelpCommonService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("删除困难补助申请")
@SaCheckPermission("difficultHelp.mine")
@SLog(tag = "困难补助申请", msg = "删除困难补助申请,id: ${args[0]}")
public Result onDelete(@Valid String id){
dao.clear(DifficultHelpInfo.class, Cnd.where("id", "=", id));
// 删除流程相关操作
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
return Result.success();
}
@At
@ApiModelProperty("获取困难补助申请")
@SaCheckPermission("difficultHelp.mine")
public Result findOne(String id) {
DifficultHelpInfo helpInfo = dao.fetch(DifficultHelpInfo.class, id);
return Result.success().addData(helpInfo);
}
}
@@ -1,20 +1,25 @@
package com.budwk.app.zhgh.staffbenefit.difficulthelp.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.zhgh.staffbenefit.difficulthelp.service.DifficultHelpCommonService;
import com.budwk.app.zhgh.staffbenefit.difficulthelp.vo.DifficultHelpPageParam;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
/**
* @version 1.0
@@ -32,6 +37,8 @@ public class DifficultHelpReadingController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private DifficultHelpCommonService difficultHelpCommonService;
@At("")
@@ -59,7 +66,8 @@ public class DifficultHelpReadingController {
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariale,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
@@ -68,19 +76,32 @@ public class DifficultHelpReadingController {
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable
t.variable taskVariable,
IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke,
(select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask' AND taskState in (10,20)) AS startTaskId
FROM
difficult_help_info info
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = difficultHelpCommonService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At
@SaCheckLogin
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("删除")
public Result delete(@Param("id") String id) {
difficultHelpCommonService.delete(id);
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
return Result.success();
}
}
@@ -72,6 +72,7 @@ public class DifficultHelpSchoolUnionApprovalController {
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
@@ -1,47 +0,0 @@
package com.budwk.app.zhgh.staffbenefit.difficulthelp.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.staffbenefit.difficulthelp.models.DifficultHelpInfo;
import com.budwk.app.zhgh.staffbenefit.difficulthelp.service.DifficultHelpCommonService;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
/**
* @version 1.0
* @Author zzr
* @nameDifficultHelpViewController
* @Date 2025/7/31 11:50
* @注释
*/
@IocBean
@Ok("json")
@ApiOperation("困难补助查看")
@At("/platform/difficultHelp/view")
public class DifficultHelpViewController {
@Inject
private Dao dao;
@Inject
private DifficultHelpCommonService difficultHelpCommonService;
@At("")
@SaCheckPermission("difficultHelp.apply")
@Ok("beetl:/platform/zhgh/staffbenefit/difficulthelp/view/index.html")
public void index() {
}
@At
@ApiModelProperty("获取困难补助申请")
@SaCheckPermission("difficultHelp.apply")
public Result findOne(String id) {
DifficultHelpInfo helpInfo = dao.fetch(DifficultHelpInfo.class, id);
return Result.success().addData(helpInfo);
}
}
@@ -28,13 +28,13 @@ public class DifficultHelpSaveInterceptor implements FlowInterceptor {
String formDataStr = execution.getArgs().getStr(FlowConst.FORM_DATA);
Dao dao = ServiceContext.find(Dao.class);
DifficultHelpInfo article = Json.fromJson(DifficultHelpInfo.class, formDataStr);
article.setApplyTime(new Date());
dao.insertOrUpdate(article);
DifficultHelpInfo difficultHelpInfo = Json.fromJson(DifficultHelpInfo.class, formDataStr);
difficultHelpInfo.setApplyTime(new Date());
dao.insertOrUpdate(difficultHelpInfo);
execution.getArgs().set(FlowConst.FORM_DATA, Json.toJson(article));
execution.getArgs().set(FlowConst.FORM_DATA, Json.toJson(difficultHelpInfo));
int instanceId = execution.getArgs().getInt(FlowConst.PROCESS_INSTANCE_ID_KEY);
dao.update(ProcessInstance.class, Chain.make("businessNo", article.getId()), Cnd.where(ProcessInstance::getId, "=", instanceId));
dao.update(ProcessInstance.class, Chain.make("businessNo", difficultHelpInfo.getId()), Cnd.where(ProcessInstance::getId, "=", instanceId));
}
}
@@ -90,7 +90,8 @@ public class MemberApplyBranchUnionApprovalController {
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariale,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
@@ -133,6 +134,7 @@ public class MemberApplyBranchUnionApprovalController {
} else {
cnd.orderBy("info." + pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = memberApplyRecordService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
@@ -1,21 +1,22 @@
package com.budwk.app.zhgh.staffmanage.member.controller.apply;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.lang.Dict;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.bpm.enums.BpmProcessInstanceStatusEnum;
import com.budwk.app.bpm.models.BpmProcessInstance;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.commons.base.Globals;
import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberApplyPageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
@@ -27,11 +28,12 @@ import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.List;
/**
* 会员申请
@@ -46,6 +48,8 @@ public class MemberApplyController {
@Inject
private FlowEngine flowEngine;
@Inject
private FlowCommonService flowCommonService;
@Inject
private MemberCommonService memberCommonService;
@At("")
@@ -54,85 +58,70 @@ public class MemberApplyController {
public void index() {
}
@At
@Ok("beetl:/platform/zhgh/staffmanage/member/apply/submit/form.html")
@SaCheckPermission("member.apply.submit")
public void form() {
}
@At
@ApiOperation("会员入会申请,我的申请列表")
@ApiOperation("保存申请")
@SaCheckPermission("member.apply.submit")
public Result pageData(MemberApplyPageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.loginName,
info.unitName,
info.unionName,
info.userState,
info.preparedBy,
info.personType,
info.sign,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariale,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke,
(select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask') AS startTaskId
FROM
member_apply_record info
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
$condition
""");
Cnd cnd = Cnd.NEW();
MemberApplyPageForm.buildSearch(cnd, pageForm);
if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.desc("info.applyDateTime");
} else {
cnd.orderBy("info." + pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
sql.setCondition(cnd);
Pagination<NutMap> pagination = memberCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At
@ApiOperation("删除入会申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.apply.submit")
@SLog(tag = "会员入会申请", msg = "删除入会申请id: ${args[0]}")
public Result onDelete(@Valid String id) {
dao.clear(MemberApplyRecord.class, Cnd.where("id", "=", id));
// 流程相关操作
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
@SLog(tag = "会员入会申请", msg = "保存申请,申请人: ${args[0].username}")
public Result save(@Param("data") MemberApplyRecord memberApplyRecord) {
dao.insertOrUpdate(memberApplyRecord);
return Result.success();
}
@At
@ApiOperation("根据申请或修改,查询不同数据")
@SaCheckPermission(value = {"member.apply.submit","member.branchUnion.record","member.schoolUnion.record"}, mode = SaMode.OR)
public Result findOne(@Valid String id, @Valid Boolean isEdit) {
if (isEdit) {
MemberApplyRecord record = dao.fetch(MemberApplyRecord.class,id);
return Result.success(record);
@ApiOperation("提交申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.apply.submit")
@SLog(tag = "会员入会申请", msg = "提交申请,申请人: ${args[0].username}")
public Result submit(@Param("data") MemberApplyRecord memberApplyRecord){
// 开启流程实例
Dict args = Dict.create();
// 设置流程变量
if ("HMC".equals(Globals.SchoolCode)) {
args.set("origin", "HMC");
memberApplyRecord.setOrigin("HMC");
} else {
args.set("origin", "OTHER");
memberApplyRecord.setOrigin("OTHER");
}
View_user user = dao.fetch(View_user.class, Cnd.where("id", "=", id));
return Result.success(user);
dao.insertOrUpdate(memberApplyRecord);
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, memberApplyRecord);
ProcessInstance instance = flowEngine.startProcessInstanceByKey("HYRH", memberApplyRecord.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务
List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null);
for (ProcessTask task : doingTaskList) {
flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args);
}
return Result.success();
}
@At
@ApiOperation("重新提交申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.apply.submit")
@SLog(tag = "会员入会申请", msg = "重新提交申请,申请人: ${args[0].username}")
public Result submitAgain(@Param("data") MemberApplyRecord memberApplyRecord, @Param("taskId") Long taskId) {
Dict dict = Dict.create();
// 设置流程变量
if ("HMC".equals(Globals.SchoolCode)) {
dict.set("origin", "HMC");
memberApplyRecord.setOrigin("HMC");
} else {
dict.set("origin", "OTHER");
memberApplyRecord.setOrigin("OTHER");
}
dao.insertOrUpdate(memberApplyRecord);
dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
flowCommonService.executeTask(dict);
return Result.success();
}
@@ -149,7 +138,6 @@ public class MemberApplyController {
}
@At
@SaCheckPermission("member.apply.submit")
public Result getApplyUserByUnionOperate(@Valid String keyWord){
@@ -173,19 +161,6 @@ public class MemberApplyController {
return Result.success(pagination.getList());
}
/**
* 校验当前申请人是否有未走完的流程,只有等流程走完才能再次申请
* @return
*/
@At
@SaCheckPermission("member.apply.submit")
@ApiOperation("校验当前申请人是否有未走完的流程")
public Result validateApply(){
int count = dao.count(BpmProcessInstance.class, Cnd.where("processInstanceInitiatorId", "=", SecurityUtil.getUserId())
.and("processInstanceStatus", "=", BpmProcessInstanceStatusEnum.RUNNING.name()));
return Result.success().addData(count);
}
/**
* 获取当前登录用户信息,是用来判断当前用户是否是会员
@@ -0,0 +1,140 @@
package com.budwk.app.zhgh.staffmanage.member.controller.apply;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberApplyPageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
/**
* 我的申请
* @author fky
*/
@IocBean
@Ok("json:full")
@ApiOperation("会员入会申请,查看")
@At("/platform/member/apply/mine")
public class MemberApplyMineController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private MemberCommonService memberCommonService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/apply/mine/index.html")
@SaCheckPermission("member.apply.mine")
public void index() {
}
@At
@ApiOperation("会员入会申请,我的申请列表")
@SaCheckPermission("member.apply.mine")
public Result pageData(MemberApplyPageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.loginName,
info.unitName,
info.unionName,
info.userState,
info.preparedBy,
info.personType,
info.sign,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke,
(select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask' AND taskState in (10,20)) AS startTaskId
FROM
member_apply_record info
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
$condition
""");
Cnd cnd = Cnd.NEW();
MemberApplyPageForm.buildSearch(cnd, pageForm);
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_MEMBER_ADMIN.name())) {
if (AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name())) {
cnd.and("info.unionId", "=", SecurityUtil.getUnionId());
} else {
cnd.and("info.userId", "=", SecurityUtil.getUserId());
}
}
if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.desc("info.applyDateTime");
} else {
cnd.orderBy("info." + pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = memberCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At
@ApiOperation("删除入会申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.apply.mine")
@SLog(tag = "会员入会申请", msg = "删除入会申请id: ${args[0]}")
public Result onDelete(@Valid String id) {
dao.clear(MemberApplyRecord.class, Cnd.where("id", "=", id));
// 流程相关操作
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
return Result.success();
}
/**
* 获取申请信息
* @param id
* @return
*/
@At
@ApiOperation("获取申请信息")
@SaCheckPermission(value = {"member.apply.mine", "member.apply.branchUnionApproval", "member.apply.branchUnionApproval"}, mode = SaMode.OR)
public Result findMemberApplyRecord(@Valid String id) {
MemberApplyRecord record = dao.fetch(MemberApplyRecord.class, id);
return Result.success().addData(record);
}
}
@@ -85,11 +85,13 @@ public class MemberApplySchoolUnionApprovalController {
info.userState,
info.preparedBy,
info.personType,
info.origin,
info.sign,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariale,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
@@ -130,6 +132,7 @@ public class MemberApplySchoolUnionApprovalController {
} else {
cnd.orderBy("info." + pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = memberApplyRecordService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
@@ -1,72 +0,0 @@
package com.budwk.app.zhgh.staffmanage.member.controller.apply;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.bpm.vo.BpmTaskApprovalRecordVo;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberApplyPageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberApplyRecordService;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import com.budwk.app.zhgh.staffmanage.member.vo.MemberCommonVo;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
import java.util.List;
/**
* 我的申请
* @author fky
*/
@IocBean
@Ok("json:full")
@ApiOperation("会员入会申请,查看")
@At("/platform/member/apply/view")
public class MemberApplyViewController {
@Inject
private Dao dao;
@Inject
private BpmService bpmService;
@Inject
private MemberCommonService memberCommonService;
@Inject
private MemberApplyRecordService memberApplyRecordService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/apply/view/index.html")
@SaCheckPermission("member.apply.submit")
public void index() {
}
/**
* 获取申请信息
* @param id
* @return
*/
@At
@ApiOperation("获取申请信息")
@SaCheckPermission(value = {"member.apply.submit", "member.apply.branchUnionApproval", "member.apply.branchUnionApproval"}, mode = SaMode.OR)
public Result findMemberApplyRecord(@Valid String id) {
MemberApplyRecord record = dao.fetch(MemberApplyRecord.class, id);
return Result.success().addData(record);
}
}
@@ -64,8 +64,6 @@ public class MemberBranchUnionAuditController {
@Inject
private Dao dao;
@Inject
private BpmService bpmService;
@Inject
private CommonService commonService;
@Inject
private MemberCommonService memberCommonService;
@@ -106,7 +104,8 @@ public class MemberBranchUnionAuditController {
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariale,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
@@ -115,12 +114,16 @@ public class MemberBranchUnionAuditController {
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariale
t.variable taskVariable,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke
FROM
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN member_change_record info ON info.id = ins.businessNo
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10
LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10
$condition
""");
Cnd cnd = Cnd.NEW();
@@ -140,21 +143,10 @@ public class MemberBranchUnionAuditController {
} else {
cnd.orderBy("info." + pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = memberCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At
@ApiOperation("分工会审核撤回")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.change.branchUnion.audit")
@SLog(tag = "会员管理-分工会管理", type = "memberBranchUnionManage", msg = "分工会审核撤回")
public Result revoke(@Valid String taskId) {
bpmService.revokeTask(taskId);
return Result.success();
}
}
@@ -2,43 +2,40 @@ package com.budwk.app.zhgh.staffmanage.member.controller.change;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.sys.models.Sys_union;
import com.budwk.app.sys.models.Sys_unit;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeOrigin;
import com.budwk.app.zhgh.staffmanage.member.models.MemberChangeRecord;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberChangePageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.List;
import java.util.stream.Stream;
@Slf4j
@IocBean
@@ -50,10 +47,12 @@ public class MemberChangeApplyController {
@Inject
private Dao dao;
@Inject
private BpmService bpmService;
private FlowEngine flowEngine;
@Inject
private CommonService commonService;
@Inject
private FlowCommonService flowCommonService;
@Inject
private MemberCommonService memberCommonService;
@At("")
@@ -68,54 +67,59 @@ public class MemberChangeApplyController {
public void form() {
}
@At
@ApiOperation("会员变更申请,我的申请列表")
@SaCheckPermission("member.change.apply")
public Result pageData(MemberChangePageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.username,
info.loginname,
info.sex,
info.unitName,
info.unionName,
info.userState,
info.preparedBy,
info.personType,
info.changeTypes,
info.applyDateTime,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariale,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariale
FROM
member_change_record info
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id
AND t.taskState = 10
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
$condition
""");
Cnd cnd = Cnd.NEW();
pageForm.buildSearch(cnd, "info.");
if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.desc("info.applyDateTime");
} else {
cnd.orderBy("info." + pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
@ApiOperation("保存申请")
@SaCheckPermission("member.apply.submit")
@SLog(tag = "会员变更申请", msg = "保存申请,申请人: ${args[0].username}")
public Result save(@Param("data") MemberChangeRecord memberChangeRecord) {
// 校验是否有变更
memberCommonService.validateChangeAndSetBasicData(memberChangeRecord);
dao.insertOrUpdate(memberChangeRecord);
return Result.success();
}
@At
@ApiOperation("提交申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.apply.submit")
@SLog(tag = "会员变更申请", msg = "提交申请,申请人: ${args[0].username}")
public Result submit(@Param("data") MemberChangeRecord memberChangeRecord){
// 校验是否有变更
memberCommonService.validateChangeAndSetBasicData(memberChangeRecord);
dao.insertOrUpdate(memberChangeRecord);
// 开启流程实例
Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, memberChangeRecord);
ProcessInstance instance = flowEngine.startProcessInstanceByKey("HYBG", memberChangeRecord.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务
List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null);
for (ProcessTask task : doingTaskList) {
flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args);
}
sql.setCondition(cnd);
Pagination<NutMap> pagination = memberCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success().addData(pagination);
return Result.success();
}
@At
@ApiOperation("重新提交申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.apply.submit")
@SLog(tag = "会员变更申请", msg = "重新提交申请,申请人: ${args[0].username}")
public Result submitAgain(@Param("data") MemberChangeRecord memberChangeRecord, @Param("taskId") Long taskId) {
// 校验是否有变更
memberCommonService.validateChangeAndSetBasicData(memberChangeRecord);
dao.insertOrUpdate(memberChangeRecord);
Dict dict = Dict.create();
dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
flowCommonService.executeTask(dict);
return Result.success();
}
@@ -15,13 +15,17 @@ import com.budwk.app.bpm.models.BpmProcessInstance;
import com.budwk.app.bpm.models.BpmProcessTask;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeOrigin;
import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeType;
import com.budwk.app.zhgh.staffmanage.member.models.MemberChangeRecord;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberManagePageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
@@ -69,6 +73,7 @@ public class MemberChangeManageController {
@At
@ApiOperation("页面数据")
@SaCheckPermission(value = {"member.change.mange", "staff.member.change.mange"}, mode = SaMode.OR)
public Result pageData(MemberManagePageForm pageForm){
Sql sql = memberCommonService.getSql(pageForm, "schoolUnion");
@@ -100,8 +105,10 @@ public class MemberChangeManageController {
record.setChangeTypes(changeTypes);
}
boolean schoolRoleBool = AuthUtil.hasRoleOr(RoleConstant.SCHOOL_UNION_CHAIRMAN.name(), RoleConstant.SCHOOL_UNION_MEMBER_ADMIN.name(), RoleConstant.SYSADMIN.name());
record.setApplyDateTime(DateUtil.date());
record.setChangeOrigin("党委会变更");
record.setChangeOrigin(schoolRoleBool ? MemberChangeOrigin.SCHOOL_UNION.name() : MemberChangeOrigin.BRANCH_UNION.name());
dao.insertOrUpdate(record);
bpmService.startSubmitProcessInstance(BpmProcessConstant.MEMBER_CHANGE.name(),
@@ -124,7 +131,7 @@ public class MemberChangeManageController {
bpmService.completeTask(param.getProcessInstanceTaskId(), param.getBpmTaskApprovalTypeEnum(), variables, List.of(SecurityUtil.getUserLoginname()));
// 如果有校工会或者超管的角色,直接审核通过了
if (AuthUtil.hasRoleOr(RoleConstant.SCHOOL_UNION_CHAIRMAN.name(), RoleConstant.SCHOOL_UNION_MEMBER_ADMIN.name(), RoleConstant.SYSADMIN.name())) {
if (schoolRoleBool) {
BpmProcessInstance committeeInstance = dao.fetch(BpmProcessInstance.class, Cnd.where("processInstanceBusinessId", "=", record.getId()));
BpmProcessTask committeeTask = dao.fetch(BpmProcessTask.class, Cnd.where(BpmProcessTask::getProcessInstanceId, "=", committeeInstance.getId())
.desc(BpmProcessTask::getCreatedAt));
@@ -142,4 +149,22 @@ public class MemberChangeManageController {
}
return Result.success();
}
@At
@ApiOperation("获取该人员所有的变更信息")
@SaCheckPermission(value = {"member.change.mange", "staff.member.change.mange"}, mode = SaMode.OR)
public Result getAllChangeMemberInfo(String userId){
List<NutMap> mapList = memberCommonService.getAllChangeInfo(userId);
if (Lang.isEmpty(mapList)) {
return Result.error("未获取到异动数据");
}
View_user user = dao.fetch(View_user.class, Cnd.where("id", "=", userId));
NutMap map = Lang.obj2nutmap(user);
map.put("user",user);
map.put("allChangeInfo", mapList);
return Result.success(map);
}
}
@@ -0,0 +1,159 @@
package com.budwk.app.zhgh.staffmanage.member.controller.change;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.staffmanage.member.models.MemberChangeRecord;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberChangePageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameMemberChangeMineController
* @Date 2025/2/14 11:13
* @注释
*/
@IocBean
@Ok("json:full")
@ApiModel("会员变更申请查看")
@At("/platform/member/change/mine")
public class MemberChangeMineController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private MemberCommonService memberCommonService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/change/mine/index.html")
@SaCheckPermission("member.change.mine")
public void index() {
}
@At
@ApiOperation("会员变更申请,我的申请列表")
@SaCheckPermission("member.change.mine")
public Result pageData(MemberChangePageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.username,
info.loginname,
info.sex,
info.unitName,
info.unionName,
info.userState,
info.preparedBy,
info.personType,
info.changeTypes,
info.applyDateTime,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke,
(select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask' AND taskState in (10,20)) AS startTaskId
FROM
member_change_record info
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
$condition
""");
Cnd cnd = Cnd.NEW();
pageForm.buildSearch(cnd, "info.");
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_MEMBER_ADMIN.name())) {
if (AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name())) {
cnd.and("info.unionId", "=", SecurityUtil.getUnionId());
} else {
cnd.and("info.userId", "=", SecurityUtil.getUserId());
}
}
if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.desc("info.applyDateTime");
} else {
cnd.orderBy("info." + pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = memberCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At
@ApiOperation("个人申请撤回")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.change.mine")
@SLog(tag = "会员变更申请", msg = "撤回申请")
public Result doRevoke(@Valid String id){
// bpmService.revokeApply(id);
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.change.mine")
@SLog(tag = "会员变更申请", msg = "删除变更申请,id: ${args[0]}")
public Result onDelete(@Valid String id){
dao.clear(MemberChangeRecord.class, Cnd.where("id", "=", id));
// 流程相关操作
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
return Result.success();
}
@At
@ApiOperation("根据id查询变更记录")
@SaCheckPermission("member.change.mine")
public Result findMemberChangeRecord(String id){
MemberChangeRecord record = dao.fetch(MemberChangeRecord.class, id);
NutMap nutMap = Lang.obj2nutmap(record);
List<NutMap> changeInfos = memberCommonService.getChangeInfos(nutMap.getString("id"));
nutMap.put("changeInfos", changeInfos);
return Result.success().addData(nutMap);
}
}
@@ -1,89 +0,0 @@
package com.budwk.app.zhgh.staffmanage.member.controller.change;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.result.Result;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.zhgh.staffmanage.member.models.MemberChangeRecord;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameMemberChangeMineController
* @Date 2025/2/14 11:13
* @注释
*/
@IocBean
@Ok("json:full")
@ApiModel("会员变更申请查看")
@At("/platform/member/change/view")
public class MemberChangeViewController {
@Inject
private Dao dao;
@Inject
private BpmService bpmService;
@Inject
private MemberCommonService memberCommonService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/change/view/index.html")
@SaCheckPermission("member.change.apply")
public void index() {
}
@At
@ApiOperation("个人申请撤回")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.change.apply")
@SLog(tag = "会员变更申请", msg = "撤回申请")
public Result doRevoke(@Valid String id){
bpmService.revokeApply(id);
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.change.apply")
@SLog(tag = "会员入会申请", msg = "删除申请")
public Result doDelete(String id){
dao.clear(MemberChangeRecord.class, Cnd.where("id", "=", id));
bpmService.deleteInstance(id);
return Result.success();
}
@At
@ApiOperation("根据id查询变更记录")
@SaCheckPermission("member.change.apply")
public Result findMemberChangeRecord(String id){
MemberChangeRecord record = dao.fetch(MemberChangeRecord.class, id);
NutMap nutMap = Lang.obj2nutmap(record);
List<NutMap> changeInfos = memberCommonService.getChangeInfos(nutMap.getString("id"));
nutMap.put("changeInfos", changeInfos);
return Result.success().addData(nutMap);
}
}
@@ -102,7 +102,8 @@ public class MemberSchoolUnionAuditController {
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariale,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
@@ -111,12 +112,16 @@ public class MemberSchoolUnionAuditController {
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariale
t.variable taskVariable,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke
FROM
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN member_change_record info ON info.id = ins.businessNo
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10
LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10
$condition
""");
Cnd cnd = Cnd.NEW();
@@ -136,6 +141,7 @@ public class MemberSchoolUnionAuditController {
} else {
cnd.orderBy("info." + pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = memberCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success().addData(pagination);
@@ -2,6 +2,7 @@ package com.budwk.app.zhgh.staffmanage.member.interceptor;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowInterceptor;
@@ -45,7 +46,8 @@ public class MemberApplyBranchApprovalInterceptor implements FlowInterceptor {
// 判断是否改变了工会关系
View_user user = dao.fetch(View_user.class, Cnd.where("id", "=", record.getUserId()));
if (!ObjectUtil.equals(user.getUnionId(), record.getAllocationUnionId())) {
if (StrUtil.isAllNotBlank(user.getUnionId(), record.getAllocationUnionId())
&& !ObjectUtil.equals(user.getUnionId(), record.getAllocationUnionId())) {
// 去判断特殊人员表里面有没有这些人,有的话先删除再增加
if (dao.count(SpecialStaff.class, Cnd.where("userId", "=", record.getUserId())) > 0) {
dao.clear(SpecialStaff.class, Cnd.where("userId", "=", record.getUserId()));
@@ -1,6 +1,7 @@
package com.budwk.app.zhgh.staffmanage.member.interceptor;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowInterceptor;
import com.budwk.app.flow.engine.core.Execution;
@@ -30,13 +31,16 @@ public class MemberApplySchoolApprovalInterceptor implements FlowInterceptor {
String allocationUnionId = execution.getArgs().getStr(FlowConst.TASK_FORM_DATA_PREFIX + "allocation_unionId");
Dao dao = ServiceContext.find(Dao.class);
dao.update(MemberApplyRecord.class, Chain.make("allocationUnionId", allocationUnionId),
Cnd.where(MemberApplyRecord::getId, "=", record.getId()));
if (StrUtil.isNotBlank(allocationUnionId)) {
dao.update(MemberApplyRecord.class, Chain.make("allocationUnionId", allocationUnionId),
Cnd.where(MemberApplyRecord::getId, "=", record.getId()));
}
// 判断如果是审核通过,并且不是HMC, 去修改用户表的基础数据
boolean submitType = execution.getArgs().getInt("submitType").equals(ProcessSubmitTypeEnum.AGREE.getCode());
boolean submitType = execution.getArgs().getInt(FlowConst.SUBMIT_TYPE).equals(ProcessSubmitTypeEnum.AGREE.getCode());
if (submitType) {
if (!"HMC".equals(record.getOrigin())) {
// 不是HMC,去修改用户表基础数据
Sys_user sysUser = new Sys_user();
BeanUtil.copyProperties(record, sysUser);
sysUser.setId(record.getUserId());
@@ -34,21 +34,18 @@ public class MemberApplyRecord extends BaseModel {
@Column
@Comment("用户id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@NotBlank(message = "用户不能为空")
@Size(max = 32)
private String userId;
@Column
@Comment("姓名")
@ColDefine(type = ColType.VARCHAR, width = 100)
@NotBlank(message = "姓名不能为空")
@Size(max = 100)
private String username;
@Column
@Comment("工号")
@ColDefine(type = ColType.VARCHAR, width = 100)
@NotBlank(message = "工号不能为空")
@Size(max = 100)
private String loginname;
@@ -60,66 +57,63 @@ public class MemberApplyRecord extends BaseModel {
@Column
@Comment("单位id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@NotBlank(message = "单位id不能为空")
@Size(max = 32)
private String unitId;
@Column
@Comment("单位名称")
@ColDefine(type = ColType.VARCHAR, width = 200)
@NotBlank(message = "单位名称不能为空")
@Size(max = 200)
private String unitName;
@Column
@Comment("工会id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@NotBlank(message = "工会id不能为空")
@Size(max = 32)
private String unionId;
@Column
@Comment("工会名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
@NotBlank(message = "工会名称不能为空")
@Size(max = 50)
private String unionName;
@Column
@Comment("性别")
@ColDefine(type = ColType.VARCHAR, width = 10)
@NotBlank(message = "性别不能为空")
@Size(max = 10)
private String sex;
@Column
@Comment("证件号码")
@ColDefine(type = ColType.VARCHAR, width = 30)
@NotBlank(message = "证件号码不能为空")
@Size(max = 30)
private String idCard;
@Column
@Comment("民族")
@ColDefine(type = ColType.VARCHAR, width = 20)
@NotBlank(message = "民族不能为空")
@Size(max = 20)
private String nation;
@Column
@Comment("政治面貌")
@ColDefine(type = ColType.VARCHAR, width = 100)
@NotBlank(message = "政治面貌不能为空")
@Size(max = 100)
private String political;
@Column
@Comment("学历")
@ColDefine(type = ColType.VARCHAR, width = 20)
@NotBlank(message = "学历不能为空")
@Size(max = 20)
private String education;
@Column
@Comment("学位")
@ColDefine(type = ColType.VARCHAR, width = 20)
@Size(max = 20)
private String academicDegree;
@Column
@Comment("职务")
@ColDefine(type = ColType.VARCHAR, width = 50)
@@ -129,35 +123,30 @@ public class MemberApplyRecord extends BaseModel {
@Column
@Comment("在职状态")
@ColDefine(type = ColType.VARCHAR, width = 50)
@NotBlank(message = "在职状态不能为空")
@Size(max = 50)
private String userState;
@Column
@Comment("人事编制")
@ColDefine(type = ColType.VARCHAR, width = 50)
@NotBlank(message = "人事编制不能为空")
@Size(max = 50)
private String preparedBy;
@Column
@Comment("人员类别")
@ColDefine(type = ColType.VARCHAR, width = 50)
@NotBlank(message = "人员类别不能为空")
@Size(max = 50)
private String personType;
@Column
@Comment("手机号码")
@ColDefine(type = ColType.VARCHAR, width = 32)
@NotBlank(message = "手机号码不能为空")
@Size(max = 32)
private String mobile;
@Column
@Comment("电子邮箱")
@ColDefine(type = ColType.VARCHAR, width = 255)
@NotBlank(message = "电子邮箱不能为空")
@Size(max = 255)
private String email;
@@ -191,7 +180,6 @@ public class MemberApplyRecord extends BaseModel {
@Column
@Comment("个人简况")
@ColDefine(type = ColType.VARCHAR, customType = "text")
@NotBlank(message = "个人简况不能为空")
private String personalData;
@Column
@@ -80,9 +80,8 @@ public class MemberChangeRecord extends BaseModel {
@Column
@Comment("出生日期")
@ColDefine(type = ColType.VARCHAR, width = 10)
@Size(max = 10)
private String birthday;
@ColDefine(type = ColType.DATE)
private Date birthday;
@Column
@Comment("证件号码")
@@ -4,7 +4,6 @@ import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord;
import com.budwk.app.zhgh.staffmanage.member.models.MemberChangeRecord;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberManagePageForm;
import org.nutz.dao.sql.Sql;
@@ -94,4 +93,11 @@ public interface MemberCommonService extends BaseService<Sys_user> {
* @param changeList 变更集合
*/
void extractChange(NutMap newMap, NutMap sourceMap, String fieldName, Map<String, String> fieldsMap, List<NutMap> changeList);
/**
* 验证变更信息
* @param record
*/
void validateChangeAndSetBasicData(MemberChangeRecord record);
}
@@ -304,12 +304,13 @@ public class MemberManageServiceImpl extends BaseServiceImpl<Sys_user> implement
history.setChangeTypes(record.getChangeTypes());
history.setChangeOrigin(record.getChangeOrigin());
// 获取会员角色,加入或退出会员组别,写了之后用处不大,注释了,暂且保留,想优化就把下面注释打开305行与304-348行取消注释
// Sys_role role = sysRoleService.getByCode(RoleConstant.MEMBER);
// 获取会员角色,加入或退出会员组别,写了之后用处不大,注释暂且保留,想优化就把下面注释打开
Sys_role role = sysRoleService.getByCode(RoleConstant.MEMBER);
// 加入会员
if (record.getMember()) {
// int activityCount = dao().count(ActivityUserScope.class, Cnd.where("userId", "=", userId).and("groupId", "=", 1));
// int memberCount = dao().count(Sys_user_role.class, Cnd.where("userId", "=", userId).and("roleId", "=", role.getId()));
// 如果没有会员角色,新增
int memberCount = dao().count(Sys_user_role.class, Cnd.where("userId", "=", userId).and("roleId", "=", role.getId()));
// if (activityCount <= 0) {
// // 取消或加入会员组别
// if (record.getIsJoinActivityMemberScope() != null && record.getIsJoinActivityMemberScope()) {
@@ -320,23 +321,24 @@ public class MemberManageServiceImpl extends BaseServiceImpl<Sys_user> implement
// dao().insert(scope);
// }
// }
// if (memberCount <= 0) {
// Sys_user_role userRole = new Sys_user_role();
// userRole.setUserId(userId);
// userRole.setRoleId(role.getId());
// dao().insert(userRole);
// }
// // 杭医特有,其他学校请删除
// record.setPreparedBy("会员");
// } else {
if (memberCount <= 0) {
Sys_user_role userRole = new Sys_user_role();
userRole.setUserId(userId);
userRole.setRoleId(role.getId());
dao().insert(userRole);
}
// 杭医特有,其他学校请删除
record.setPreparedBy("会员");
} else {
// if (record.getIsExitActivityMemberScope() != null && record.getIsExitActivityMemberScope()) {
// dao().clear(ActivityUserScope.class, Cnd.where("userId", "=", userId).and("groupId", "=", 1));
// }
// dao().clear(Sys_user_role.class, Cnd.where("userId", "=", userId).and("roleId", "=", Roles.MEMBER));
// // 杭医特有,其他学校请删除
// record.setPreparedBy("教职工");
// }
//
// 非会员取消会员角色
dao().clear(Sys_user_role.class, Cnd.where("userId", "=", userId).and("roleId", "=", role.getId()));
// 杭医特有,其他学校请删除
record.setPreparedBy("教职工");
}
// // 加入福利会员 是否加入福利项目
// if (record.getWelfareMember() && record.getIsJoinWelfareProject() != null && record.getIsJoinWelfareProject()) {
// WelfareList welfareList = new WelfareList();
@@ -349,7 +351,7 @@ public class MemberManageServiceImpl extends BaseServiceImpl<Sys_user> implement
// welfareList.setPersonType(record.getPersonType());
// welfareList.setWelfareUnitId(record.getUnitId());
// dao().insert(welfareList);
}
// }
// 到此,表明审核通过,需要存储历史数据,并修改用户数据
BeanUtil.copyProperties(record, info);
@@ -480,6 +482,24 @@ public class MemberManageServiceImpl extends BaseServiceImpl<Sys_user> implement
}
@Override
public void validateChangeAndSetBasicData(MemberChangeRecord record) {
// 校验有没有发生变更
List<NutMap> changeInfos = getChangeInfos(record);
if (Lang.isEmpty(changeInfos)) {
throw new BaseException("未获取到异动数据");
}
View_user user = dao().fetch(View_user.class, Cnd.where("id", "=", record.getUserId()));
// 比较有哪些变更类型
List<String> changeTypes = compareChangeType(record, user);
record.setChangeTypes(changeTypes);
record.setUserId(SecurityUtil.getUserId());
// 变更来源 个人
record.setChangeOrigin(MemberChangeOrigin.PERSONAL.name());
}
private String booleanVerification(Object value) {
// 检查是否为null或空字符串
if (ObjectUtil.isAllEmpty(value, "")) {