Merge remote-tracking branch 'origin/master'
Some checks are pending
Java CI with Maven / build (11) (push) Waiting to run
Java CI with Maven / build (17) (push) Waiting to run
Java CI with Maven / build (8) (push) Waiting to run
yudao-ui-admin CI / build (14.x) (push) Waiting to run
yudao-ui-admin CI / build (16.x) (push) Waiting to run

This commit is contained in:
XaoLi717 2024-12-19 15:06:22 +08:00
commit f03b257a19
13 changed files with 227 additions and 41 deletions

View File

@ -57,6 +57,13 @@ public class QjglController {
LocalDateTime endTime = LocalDateTime.parse(createReqVO.getEndTime(), formatter);
return success(qjglService.createQjgl2(getLoginUserId(),createReqVO,startTime,endTime));
}
@PostMapping("/saveDraft")
@Operation(summary = "创建请假为草稿")
@PreAuthorize("@ss.hasPermission('home:qjgl:create')")
public CommonResult<Long> saveDraft(@Valid @RequestBody QjglSaveReqVO createReqVO) {
return success(qjglService.saveDraft(getLoginUserId(),createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新请假管理")
@PreAuthorize("@ss.hasPermission('home:qjgl:update')")
@ -100,7 +107,13 @@ public class QjglController {
// // 转换并返回结果
// return success(new PageResult<>(QjglConvert.INSTANCE.convertList(pageResult.getList(), deptMap), pageResult.getTotal()));
}
@GetMapping("/draft")
@Operation(summary = "获得请假草稿分页")
@PreAuthorize("@ss.hasPermission('home:qjgl:query')")
public CommonResult<PageResult<QjglRespVO>> getQjglDraft(@Valid QjglPageReqVO pageReqVO) {
PageResult<QjglDO> pageResult = qjglService.getQjglDraft(pageReqVO);
return success(BeanUtils.toBean(pageResult, QjglRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出请假管理 Excel")
@PreAuthorize("@ss.hasPermission('home:qjgl:export')")

View File

@ -31,6 +31,25 @@ public interface QjglMapper extends BaseMapperX<QjglDO> {
.eqIfPresent(QjglDO::getUserId, reqVO.getUserId())
.betweenIfPresent(QjglDO::getCreateTime, reqVO.getCreateTime())
.eqIfPresent(QjglDO::getStatus, reqVO.getStatus())
.ne(QjglDO::getStatus, 100) // 排除 status = 100 的记录
.orderByDesc(QjglDO::getId));
}
default PageResult<QjglDO> selectDraft(QjglPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<QjglDO>()
.eqIfPresent(QjglDO::getTitle, reqVO.getTitle())
.eqIfPresent(QjglDO::getReason, reqVO.getReason())
.eqIfPresent(QjglDO::getType, reqVO.getType())
.betweenIfPresent(QjglDO::getStartTime, reqVO.getStartTime())
.betweenIfPresent(QjglDO::getEndTime, reqVO.getEndTime())
.eqIfPresent(QjglDO::getDay, reqVO.getDay())
.eqIfPresent(QjglDO::getFilePath, reqVO.getFilePath())
.likeIfPresent(QjglDO::getUserName, reqVO.getUserName())
.eqIfPresent(QjglDO::getDeptId, reqVO.getDeptId())
.eqIfPresent(QjglDO::getDeptName, reqVO.getDeptName())
.eqIfPresent(QjglDO::getUserId, reqVO.getUserId())
.betweenIfPresent(QjglDO::getCreateTime, reqVO.getCreateTime())
.eqIfPresent(QjglDO::getStatus, reqVO.getStatus())
.eq(QjglDO::getStatus, 100) // 强制过滤 status = 100
.orderByDesc(QjglDO::getId));
}
//

View File

@ -51,7 +51,9 @@ public interface QjglService {
* @return 请假管理分页
*/
PageResult<QjglDO> getQjglPage(QjglPageReqVO pageReqVO);
PageResult<QjglDO> getQjglDraft(QjglPageReqVO pageReqVO);
PageResult<QjglDO> getQjglPage(Long userid,QjglPageReqVO pageReqVO);
public Long saveDraft(Long userId,QjglSaveReqVO createReqVO);
/**
* 改变请假管理数据状态

View File

@ -55,7 +55,12 @@ public class QjglServiceImpl implements QjglService {
// 插入
QjglDO qjgl = BeanUtils.toBean(createReqVO, QjglDO.class)
.setUserId(userId).setStatus(BpmTaskStatusEnum.RUNNING.getStatus());
qjglMapper.insert(qjgl);
if (createReqVO.getCurfullpath().contains("?") ) {
qjglMapper.updateById(qjgl);
} else {
qjglMapper.insert(qjgl);
}
// 发起 BPM 流程
Map<String, Object> processInstanceVariables = new HashMap<>();
@ -103,6 +108,15 @@ public class QjglServiceImpl implements QjglService {
// 返回
return qjgl.getId();
}
@Override
public Long saveDraft(Long userId,QjglSaveReqVO createReqVO) {
// 插入
QjglDO qjgl = BeanUtils.toBean(createReqVO, QjglDO.class).setUserId(userId).setStatus(100);
qjglMapper.insert(qjgl);
// 返回
return qjgl.getId();
}
@Override
public void updateQjgl(QjglSaveReqVO updateReqVO) {
// 校验存在
@ -139,7 +153,12 @@ public class QjglServiceImpl implements QjglService {
@Override
public PageResult<QjglDO> getQjglPage(QjglPageReqVO pageReqVO) {
return qjglMapper.selectPage(pageReqVO);
} @Override
}
@Override
public PageResult<QjglDO> getQjglDraft(QjglPageReqVO pageReqVO) {
return qjglMapper.selectDraft(pageReqVO);
}
@Override
public PageResult<QjglDO> getQjglPage(Long userId,QjglPageReqVO pageReqVO) {
return qjglMapper.selectPage(userId,pageReqVO);
}

View File

@ -207,6 +207,8 @@ public class CodegenEngine {
// Vue3 标准模版
.put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/flowindex.vue"),
vue3FilePath("views/${table.moduleName}/${table.businessName}/index.vue"))
.put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/flowindexDraft.vue"),
vue3FilePath("views/${table.moduleName}/${table.businessName}/indexDraft.vue"))
.put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/flowform.vue"),
vue3FilePath("views/${table.moduleName}/${table.businessName}/${simpleClassName}Form.vue"))
.put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/flowdetail.vue"),

View File

@ -54,6 +54,16 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
return success(${classNameVar}Service.create${simpleClassName}(getLoginUserId(),createReqVO));
}
@PostMapping("/saveDraft")
@Operation(summary = "创建${table.classComment}为草稿")
#if ($sceneEnum.scene == 1)
@PreAuthorize("@ss.hasPermission('${permissionPrefix}:create')")
#end
public CommonResult<${primaryColumn.javaType}> saveDraft${simpleClassName}(@Valid @RequestBody ${sceneEnum.prefixClass}${table.className}SaveReqVO createReqVO) {
return success(${classNameVar}Service.saveDraft(getLoginUserId(),createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新${table.classComment}")
#if ($sceneEnum.scene == 1)
@ -86,6 +96,7 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
return success(BeanUtils.toBean(${classNameVar}, ${sceneEnum.prefixClass}${table.className}RespVO.class));
}
#if ( $table.templateType != 2 )
@GetMapping("/page")
@Operation(summary = "获得${table.classComment}分页")
@ -96,7 +107,6 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
PageResult<${table.className}DO> pageResult = ${classNameVar}Service.get${simpleClassName}Page(pageReqVO);
return success(BeanUtils.toBean(pageResult, ${sceneEnum.prefixClass}${table.className}RespVO.class));
}
## 特殊:树表专属逻辑(树不需要分页接口)
#else
@GetMapping("/list")
@ -110,6 +120,17 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
}
#end
@GetMapping("/draft")
@Operation(summary = "获得${table.classComment}草稿分页")
#if ($sceneEnum.scene == 1)
@PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")
#end
public CommonResult<PageResult<${sceneEnum.prefixClass}${table.className}RespVO>> get${simpleClassName}Draft(@Valid ${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO) {
PageResult<${table.className}DO> pageResult = ${classNameVar}Service.get${simpleClassName}Draft(pageReqVO);
return success(BeanUtils.toBean(pageResult, ${sceneEnum.prefixClass}${table.className}RespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出${table.classComment} Excel")
#if ($sceneEnum.scene == 1)

View File

@ -54,13 +54,22 @@ public interface ${table.className}Mapper extends BaseMapperX<${table.className}
default PageResult<${table.className}DO> selectPage(${sceneEnum.prefixClass}${table.className}PageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<${table.className}DO>()
#listCondition()
.ne(QjglDO::getStatus, 100) // 排除 status = 100 的记录
.orderByDesc(${table.className}DO::getId));## 大多数情况下id 倒序
}
default PageResult<${table.className}DO> selectDraft(${sceneEnum.prefixClass}${table.className}PageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<${table.className}DO>()
#listCondition()
.eq(QjglDO::getStatus, 100) // 排除 status = 100 的记录
.orderByDesc(${table.className}DO::getId));## 大多数情况下id 倒序
}
//由于传入参数userId因此替换掉这一行.eqIfPresent(${table.className}DO::getUserId, userId)
default PageResult<${table.className}DO> selectPage(long userId,${sceneEnum.prefixClass}${table.className}PageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<${table.className}DO>()
#listCondition()
.ne(QjglDO::getStatus, 100) // 排除 status = 100 的记录
.orderByDesc(${table.className}DO::getId));## 大多数情况下id 倒序
}

View File

@ -25,6 +25,10 @@ public interface ${table.className}Service {
* @return 编号
*/
${primaryColumn.javaType} create${simpleClassName}(Long userId,@Valid ${sceneEnum.prefixClass}${table.className}SaveReqVO createReqVO);
/* 存为草稿 */
${primaryColumn.javaType} saveDraft(Long userId,@Valid ${sceneEnum.prefixClass}${table.className}SaveReqVO createReqVO);
/**
* 更新${table.classComment}
*
@ -61,6 +65,8 @@ public interface ${table.className}Service {
* @return ${table.classComment}分页
*/
PageResult<${table.className}DO> get${simpleClassName}Page(${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO);
PageResult<${table.className}DO> get${simpleClassName}Draft(${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO);
#else
/**
* 获得${table.classComment}列表
@ -124,6 +130,7 @@ public interface ${table.className}Service {
*/
${subPrimaryColumn.javaType} create${subSimpleClassName}(@Valid ${subTable.className}DO ${subClassNameVar});
/**
* 更新${subTable.classComment}
*

View File

@ -57,6 +57,15 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
private ${subTable.className}Mapper ${subClassNameVars.get($index)}Mapper;
#end
@Override
public ${primaryColumn.javaType} saveDraft(Long userId,${sceneEnum.prefixClass}${table.className}SaveReqVO createReqVO) {
// 插入
${table.className}DO ${classNameVar} = BeanUtils.toBean(createReqVO, ${table.className}DO.class).setUserId(userId).setStatus(100);
${classNameVar}Mapper.insert(${classNameVar});
// 返回
return qjgl.getId();
}
@Override
## 特殊:主子表专属逻辑(非 ERP 模式)
#if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 )
@ -261,6 +270,11 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
public PageResult<${table.className}DO> get${simpleClassName}Page(${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO) {
return ${classNameVar}Mapper.selectPage(pageReqVO);
}
@Override
public PageResult<${table.className}DO> get${simpleClassName}Draft(${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO) {
return ${classNameVar}Mapper.selectDraft(pageReqVO);
}
#else
@Override
public List<${table.className}DO> get${simpleClassName}List(${sceneEnum.prefixClass}${table.className}ListReqVO listReqVO) {

View File

@ -42,6 +42,15 @@ export const ${simpleClassName}Api = {
create${simpleClassName}: async (data: ${simpleClassName}VO) => {
return await request.post({ url: `${baseURL}/create`, data })
},
// 保存为草稿
saveDraft: async (data: ${simpleClassName}VO) => {
return await request.post({ url: `${baseURL}/saveDraft`, data })
},
// 查询${table.classComment}草稿
get${simpleClassName}Draft: async (params: any) => {
return await request.get({ url: `${baseURL}/draft`, params })
},
// 修改${table.classComment}
update${simpleClassName}: async (data: ${simpleClassName}VO) => {

View File

@ -38,23 +38,23 @@
</el-form-item>
#elseif ($column.htmlType == "input" && !$column.primaryKey)## 忽略主键,不用在表单里
<el-form-item label="${comment}" prop="${javaField}">
<el-input v-model="formData.${javaField}" placeholder="请输入${comment}" disabled />
<el-input v-model="formData.${javaField}" placeholder="请输入${comment}" :disabled="!isEditable('${javaField}')" />
</el-form-item>
#elseif($column.htmlType == "imageUpload")## 图片上传
<el-form-item label="${comment}" prop="${javaField}">
<UploadImg v-model="formData.${javaField}" disabled />
<UploadImg v-model="formData.${javaField}" :disabled="!isEditable('${javaField}')" />
</el-form-item>
#elseif($column.htmlType == "fileUpload")## 文件上传
<el-form-item label="${comment}" prop="${javaField}">
<UploadFile v-model="formData.${javaField}" disabled />
<UploadFile v-model="formData.${javaField}" :disabled="!isEditable('${javaField}')" />
</el-form-item>
#elseif($column.htmlType == "editor")## 文本编辑器
<el-form-item label="${comment}" prop="${javaField}">
<Editor v-model="formData.${javaField}" height="150px" disabled />
<Editor v-model="formData.${javaField}" height="150px" :disabled="!isEditable('${javaField}')" />
</el-form-item>
#elseif($column.htmlType == "select")## 下拉框
<el-form-item label="${comment}" prop="${javaField}">
<el-select v-model="formData.${javaField}" placeholder="请选择${comment}" disabled>
<el-select v-model="formData.${javaField}" placeholder="请选择${comment}" :disabled="!isEditable('${javaField}')" >
#if ("" != $dictType)## 有数据字典
<el-option
v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())"
@ -69,12 +69,13 @@
</el-form-item>
#elseif($column.htmlType == "checkbox")## 多选框
<el-form-item label="${comment}" prop="${javaField}">
<el-checkbox-group v-model="formData.${javaField}">
<el-checkbox-group v-model="formData.${javaField}" :disabled="!isEditable('${javaField}')" >
#if ("" != $dictType)## 有数据字典
<el-checkbox
v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())"
:key="dict.value"
:label="dict.value"
:disabled="!isEditable('${javaField}')"
>
{{ dict.label }}
</el-checkbox>
@ -84,8 +85,8 @@
</el-checkbox-group>
</el-form-item>
#elseif($column.htmlType == "radio")## 单选框
<el-form-item label="${comment}" prop="${javaField}">
<el-radio-group v-model="formData.${javaField}">
<el-form-item label="${comment}" prop="${javaField}" >
<el-radio-group v-model="formData.${javaField}" :disabled="!isEditable('${javaField}')" >
#if ("" != $dictType)## 有数据字典
<el-radio
v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())"
@ -100,17 +101,18 @@
</el-radio-group>
</el-form-item>
#elseif($column.htmlType == "datetime")## 时间框
<el-form-item label="${comment}" prop="${javaField}">
<el-form-item label="${comment}" prop="${javaField}" >
<el-date-picker
v-model="formData.${javaField}"
type="date"
value-format="x"
placeholder="选择${comment}"
:disabled="!isEditable('${javaField}')"
/>
</el-form-item>
#elseif($column.htmlType == "textarea")## 文本框
<el-form-item label="${comment}" prop="${javaField}">
<el-input v-model="formData.${javaField}" type="textarea" placeholder="请输入${comment}" disabled />
<el-input v-model="formData.${javaField}" type="textarea" placeholder="请输入${comment}" :disabled="!isEditable('${javaField}')" />
</el-form-item>
#end
#end
@ -202,31 +204,24 @@ const ${subClassNameVar}FormRef = ref()
#end
#end
/** 打开弹窗 */
## const open = async (type: string, id?: number) => {
## dialogVisible.value = true
## dialogTitle.value = t('action.' + type)
## formType.value = type
## resetForm()
## // 修改时,设置数据
## if (id) {
## formLoading.value = true
## try {
## formData.value = await ${simpleClassName}Api.get${simpleClassName}(id)
## } finally {
## formLoading.value = false
## }
## }
## ## 特殊:树表专属逻辑
## #if ( $table.templateType == 2 )
## await get${simpleClassName}Tree()
## #end
## }
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
const editableFields = ref([])
const isEditable = (field) => {
return editableFields.value.includes(field); // 如果字段在 editableFields 中,则返回 true
}
/** 提交表单 */
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
const updatetForm = async () => {
// 校验表单
await formRef.value.validate()
// 提交请求
formLoading.value = true
try {
const data = formData.value as unknown as ${simpleClassName}VO
await ${simpleClassName}Api.update${simpleClassName}(data)
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
@ -255,12 +250,47 @@ const get${simpleClassName}Tree = async () => {
${classNameVar}Tree.value.push(root)
}
#end
const itemControl = async () => {
// console.log(userId,"userId")
// console.log(queryId,"queryId")
let flag = false
let itemType = ""
let itemContent = ""
if (queryId.length > 33 ) { //流程中打开表单
const taskids = await TaskApi.getTaskIdsForProcessInstance( queryId ) //通过流程实例id得到待办任务列表
for (const taskid of taskids) {
// 在 for...of 中可以使用 await
const assignee = await TaskApi.getTaskAssignee(taskid); //通过待办任务id得到审批人
//console.log(assignee, "assignee");
if ( assignee == userId ) {
flag = true
itemType = await TaskApi.getTaskConfigFromBpmn( taskid ,"itemType")
//console.log(itemType,"itemType")
if ( itemType == "1") {
itemContent = await TaskApi.getTaskConfigFromBpmn( taskid ,"itemContent")
}
}
}
if ( flag ) { //当然用户是审批人
if ( itemType == "1") { //表单字段0:禁用,1:允许
//editableFields.value.push("userName")
const parsedObject = JSON.parse(itemContent);
Object.entries(parsedObject).forEach(([key, value]) => {
editableFields.value.push( key )
//console.log(key);
});
}
}
}
}
onMounted(async () => {
const id = props.id || queryId
//console.log("id",id)
if (id) {
try {
formData.value = await ${simpleClassName}Api.get${simpleClassName}(id)
await itemControl()
} finally {
}
}

View File

@ -137,7 +137,8 @@
#end
<template #footer>
<el-row justify="end">
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
<el-button @click="submitForm" type="primary" :disabled="formLoading">提交审批</el-button>
<el-button @click="saveDraft" type="warning" :disabled="draftButton">存为草稿</el-button>
</el-row>
</template>
</el-card>
@ -171,6 +172,7 @@ const { push, currentRoute } = useRouter() // 路由
// const dialogVisible = ref(false) // 弹窗的是否展示
// const dialogTitle = ref('') // 弹窗的标题
const formLoading = ref(false) // 表单的加载中1修改时的数据加载2提交的按钮禁用
const draftButton = ref(false)
const formType = ref('') // 表单的类型create - 新增update - 修改
const formData = ref({
#foreach ($column in $columns)
@ -231,6 +233,27 @@ const startUserSelectAssigneesFormRules = ref({}) // 发起人选择审批人的
//const userList = ref<any[]>([]) // 用户列表
/** 提交表单 */
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
const saveDraft = async () => {
// 校验表单
await formRef.value.validate()
// 提交请求
formLoading.value = true
try {
const data = formData.value as unknown as ${simpleClassName}VO
await ${simpleClassName}Api.saveDraft(data)
message.success(t('common.saveDraft'))
// 关闭当前 Tab
delView(unref(currentRoute))
await push({ name: '${simpleClassName}' })
} finally {
formLoading.value = false
}
}
const submitForm = async () => {
// 校验表单
await formRef.value.validate()
@ -275,10 +298,13 @@ const submitForm = async () => {
data.startUserSelectAssignees = startUserSelectAssignees.value
}
const curFullPath = currentRoute.value.fullPath
let curFullPath = currentRoute.value.fullPath
if( curFullPath ) {
data.curfullpath = curFullPath
}
if (curFullPath.includes("?")) {
curFullPath = curFullPath.split("?")[0];
}
const processKey = await FormProcessMappingApi.selectProcessKey( curFullPath )
if ( processKey) {
data.processDefinitionKey = processKey
@ -325,7 +351,21 @@ const get${simpleClassName}Tree = async () => {
/** 打开弹窗 */
onMounted(async () => {
await getUserInfo()
const curFullPath = currentRoute.value.fullPath
let curFullPath = currentRoute.value.fullPath
if (curFullPath.includes("?")) {
// 使用 URLSearchParams 提取查询参数
const params = new URLSearchParams(curFullPath.split("?")[1]);
const id = params.get("id") ;
// 获取路径部分
curFullPath = curFullPath.split("?")[0];
// console.log("Path:", curFullPath);
// console.log("id:", id);
if ( id != "") {
formData.value = await ${simpleClassName}Api.get${simpleClassName}(Number( id) )
draftButton.value= true
}
}
const processKey = await FormProcessMappingApi.selectProcessKey( curFullPath )
if ( !processKey ) {

View File

@ -137,6 +137,7 @@
#else
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
#end
<el-table-column label="序号" align="center" type="index" width="55" />
## 特殊:主子表专属逻辑
#if ( $table.templateType == 12 && $subTables && $subTables.size() > 0 )
<!-- 子表的列表 -->