rev:自定义表单数据功能维护

This commit is contained in:
zhangzq
2024-05-13 08:46:10 +08:00
parent c7003f285b
commit e1d67fd23e
22 changed files with 492 additions and 511 deletions

View File

@@ -53,7 +53,11 @@ public class SecurityUtils {
* @return 系统用户名称 * @return 系统用户名称
*/ */
public static String getCurrentNickName() { public static String getCurrentNickName() {
return getCurrentUser().getPresonName(); CurrentUser user = getCurrentUser();
if (user!=null){
return user.getPresonName();
}
return null;
} }
/** /**

View File

@@ -12,5 +12,6 @@ import org.nl.wms.config_manage.form_struc.service.dao.BmFormStruc;
* @since 2024-03-25 * @since 2024-03-25
*/ */
public interface IBmFormStrucService extends IService<BmFormStruc> { public interface IBmFormStrucService extends IService<BmFormStruc> {
BmFormStruc getFormType(String form_type); BmFormStruc getFormType(String form_type);
} }

View File

@@ -36,6 +36,7 @@ public class StackingTaskHandler implements TaskHandler {
task.setPoint_code1(from.getString("start_point")); task.setPoint_code1(from.getString("start_point"));
task.setPoint_code2(from.getString("struct_code")); task.setPoint_code2(from.getString("struct_code"));
taskService.createTask(task); taskService.createTask(task);
return (JSONObject)JSONObject.toJSON(task); from.put("task_code",task.getTask_code());
return from;
} }
} }

View File

@@ -24,6 +24,7 @@ public class BpmnJSONConverter {
public static Map<String, BaseNodeConverter> Node_Converter= new HashMap<>(); public static Map<String, BaseNodeConverter> Node_Converter= new HashMap<>();
static { static {
Node_Converter.put("form",new FormConverter()); Node_Converter.put("form",new FormConverter());
Node_Converter.put("strucForm",new StrucFormConverter());
Node_Converter.put("startEvent",new StartEventConverter()); Node_Converter.put("startEvent",new StartEventConverter());
Node_Converter.put("endEvent",new EndEventConverter()); Node_Converter.put("endEvent",new EndEventConverter());
Node_Converter.put("gateWay",new GatewayConverter()); Node_Converter.put("gateWay",new GatewayConverter());

View File

@@ -0,0 +1,48 @@
package org.nl.wms.flow_manage.flow.framework.converter.node.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.nl.wms.flow_manage.flow.framework.BpmnModel;
import org.nl.wms.flow_manage.flow.framework.converter.node.BaseNodeConverter;
import org.nl.wms.flow_manage.flow.framework.entity.node.base.impl.FlowNode;
import org.nl.wms.flow_manage.flow.framework.entity.node.impl.task.impl.Form;
import org.nl.wms.flow_manage.flow.framework.entity.node.impl.task.impl.StrucForm;
import java.util.Iterator;
/*
* @author ZZQ
* @Date 2024/4/26 11:08
*/
public class StrucFormConverter extends BaseNodeConverter {
@Override
public FlowNode convertToBpmnModel(Iterator<JSONObject> iterator, JSONObject node, BpmnModel model) {
JSONObject properties = node.getJSONObject("properties");
String type = node.getString("type");
Boolean pass = properties.getBoolean("passNode");
StrucForm form = new StrucForm();
form.setPassNode(pass);
form.setId(node.getString("id"));
form.setType(node.getString("type"));
form.setForm_type(properties.getString("form_type"));
form.setName(properties.getString("name"));
form.setCategory(properties.getString("category"));
form.setDocumentation(properties.getString("documentation"));
//设置触发事件
form.setExecutionListeners(null);
JSONArray skipExpressions = properties.getJSONArray("skipExpression");
if (skipExpressions!=null){
for (int i = 0; i < skipExpressions.size(); i++) {
form.getSkipExpression().add(skipExpressions.getString(i));
}
}
if (pass!=null && pass){
model.getPassNode().add(type);
}
model.getNodeFlow().add(type);
model.getNodeProperties().put(type,properties);
model.getProcesses().put(form.getId(),form);
return form;
}
}

View File

@@ -23,6 +23,7 @@ import org.springframework.transaction.annotation.Transactional;
/* /*
* @author ZZQ * @author ZZQ
* @Date 2024/3/18 11:08 * @Date 2024/3/18 11:08
* !!!流程中的单据不变,除非是子流程
* sql如果要考虑事务的话可以考虑将sql放入一个地方最后一起执行 * sql如果要考虑事务的话可以考虑将sql放入一个地方最后一起执行
*/ */
@Slf4j @Slf4j
@@ -54,6 +55,7 @@ public abstract class FlowNodeActivityBehavior<T> {
.eq("proc_inst_id",entity.getProc_inst_id()) .eq("proc_inst_id",entity.getProc_inst_id())
.set("status", StatusEnum.FLOW_STATUS.code("节点完成")) .set("status", StatusEnum.FLOW_STATUS.code("节点完成"))
.set("form_data", JSONObject.toJSON(entity.getT()).toString()) .set("form_data", JSONObject.toJSON(entity.getT()).toString())
.set("form_type",entity.getForm_type())
.set("update_time", DateUtil.now())); .set("update_time", DateUtil.now()));
this.leaveActivity(entity); this.leaveActivity(entity);
}catch (Exception ex){ }catch (Exception ex){

View File

@@ -0,0 +1,100 @@
package org.nl.wms.flow_manage.flow.framework.engine.behavior.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.config_manage.form_struc.service.IBmFormStrucService;
import org.nl.wms.config_manage.form_struc.service.dao.BmFormStruc;
import org.nl.wms.flow_manage.flow.framework.engine.behavior.FlowNodeActivityBehavior;
import org.nl.wms.flow_manage.flow.framework.entity.ExecutionEntity;
import org.nl.wms.flow_manage.flow.framework.entity.node.base.impl.FlowElement;
import org.nl.wms.flow_manage.flow.framework.entity.node.impl.task.impl.Form;
import org.nl.wms.flow_manage.flow.framework.entity.node.impl.task.impl.StrucForm;
import org.nl.wms.flow_manage.flow.framework.process.nodeType.TypeHandler;
import org.nl.wms.pm_manage.form_data.service.IPmFormDataService;
import org.nl.wms.pm_manage.form_data.service.dao.PmFormData;
import org.nl.wms.stor_manage.service.in.iostor.IStIvtIostorinvInService;
import org.nl.wms.stor_manage.service.in.iostor.dao.StIvtIostorinvIn;
import org.nl.wms.stor_manage.service.in.iostor_dtl.IStIvtIostorinvdtlInService;
import org.nl.wms.stor_manage.service.in.iostor_dtl.dao.StIvtIostorinvdtlIn;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/*
* @author ZZQ
* @Date 2024/3/18 13:17
* 源UserTask
* 获取不同的类型执行器.处理该节点:获取当前表单
获取表单配置表
确认有没有自定义字段:如果有则创建自定义字段
生成出入库单单据
*/
@Service("strucForm")
public class StrucFormActivityBehavior extends FlowNodeActivityBehavior<JSONObject> {
@Autowired
IBmFormStrucService iBmFormStrucService;
//分配明细用公用表
@Autowired
IPmFormDataService iPmFormDataService;
@Override
public void execute(ExecutionEntity<JSONObject> entity) {
//有的参数是在明细表,有的参数是在任务表,参数源头需要统一,否则数据切换很麻烦
FlowElement flowElement = entity.getCurrentFlowElement();
if (flowElement instanceof StrucForm){
//根据当前表单配置生成当前节点表单数据
StrucForm currentNode = (StrucForm) flowElement;
BmFormStruc targetStruc = iBmFormStrucService.getOne(new QueryWrapper<BmFormStruc>()
.eq("form_type", currentNode.getForm_type()));
if (targetStruc==null){
throw new BadRequestException("当前节点表单类型:"+currentNode.getForm_type()+"没有配置数据格式");
}
//TEST:这部分数据放在框架中,每个节点都需要
entity.setForm_struc(targetStruc);
//处理自定义参数:
if (currentNode.getSkipExpression()!=null || currentNode.getSkipExpression().size()>0){
TypeHandler<JSONObject,JSONObject> typeHandler = TypeHandler.HANDLER_MAP.get(currentNode.getCategory());
if (typeHandler==null){
throw new BadRequestException("【flow】当前节点处理类型未定义");
}
JSONObject handler = typeHandler.handler(currentNode.getSkipExpression(), entity.getT(), targetStruc);
//该参数里包含三部分:主数据基础字段,组数据自定义及明细,
//明细:基础字段,组数据自定义及参数:
//TODO:id,code等非映射字段后续可以通过SpringEL表达式生成
handler.put("id",IdUtil.getStringId());
handler.put("create_time",DateUtil.now());
handler.put("form_type",entity.getForm_type());
handler.put("create_name",SecurityUtils.getCurrentNickName());
handler.put("status",StatusEnum.FORM_STATUS.code("生成"));
handler.put("code",CodeUtil.getNewCode(currentNode.getForm_type()));
PmFormData mst = handler.toJavaObject(PmFormData.class);
JSONArray itemArr = handler.getJSONArray("item");
if(itemArr !=null){
for (int i = 0; i < itemArr.size(); i++) {
JSONObject dtl = itemArr.getJSONObject(i);
dtl.put("inv_id",mst.getId());
dtl.put("status",StatusEnum.FORM_STATUS.code("生成"));
dtl.put("id",IdUtil.getStringId());
PmFormData iostorinvdtl= dtl.toJavaObject(PmFormData.class);
iPmFormDataService.save(iostorinvdtl);
}
}
iPmFormDataService.save(mst);
entity.setT(handler);
entity.setForm_id(mst.getId());
entity.setForm_type(currentNode.getForm_type());
}
}
}
}

View File

@@ -0,0 +1,78 @@
package org.nl.wms.flow_manage.flow.framework.entity.node.impl.task.impl;
import lombok.Data;
import org.nl.wms.config_manage.form_struc.service.dao.BmFormStruc;
import org.nl.wms.flow_manage.flow.framework.entity.node.impl.task.ExecuteTask;
import java.util.*;
/*
* @author ZZQ
* @Date 2024/3/18 11:30
* 源UserTask
*/
@Data
public class StrucForm extends ExecuteTask {
/**
* 表单类型
*/
private String form_type;
/**
* 表单处理类别
*/
private String category;
/**
* 处理表达式
*/
private List<String> skipExpression = new ArrayList<>();
/**
* 优先级
*/
private String priority;
/**
* 表单自定义参数
*/
private List<BmFormStruc> customProperties = new ArrayList<>();
/**
* 表单验证字段
*/
private String validateFormFields;
/**
* 变量名称
*/
private String taskIdVariableName;
/**
* 单据受让人跟归属人:这个节点的数据谁能看
* 暂时不用
*/
@Deprecated
private String assignee;
@Deprecated
private String owner;
/**
* 用于同一部署判断:父子流程使用:暂时不用
*/
@Deprecated
private boolean sameDeployment = true;
/**
* 表单类型:自定义表达类型
*/
@Deprecated
private String dueDate;
@Deprecated
private String businessCalendarName;
@Deprecated
private String extensionId;
/**
* 表单处理中的候选人信息
*/
@Deprecated
private List<String> candidateUsers = new ArrayList<>();
@Deprecated
private Map<String, Set<String>> customUserIdentityLinks = new HashMap<>();
@Deprecated
private List<String> candidateGroups = new ArrayList<>();
@Deprecated
private Map<String, Set<String>> customGroupIdentityLinks = new HashMap<>();
}

View File

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.utils.ListOf; import org.nl.common.utils.ListOf;
import org.nl.wms.config_manage.form_struc.service.IBmFormStrucService; import org.nl.wms.config_manage.form_struc.service.IBmFormStrucService;
import org.nl.wms.config_manage.form_struc.service.dao.BmFormStruc; import org.nl.wms.config_manage.form_struc.service.dao.BmFormStruc;
@@ -29,7 +30,10 @@ public class MappingHandler extends TypeHandler<JSONObject, JSONObject> {
@Override @Override
public JSONObject handler(List<String> param, JSONObject data, BmFormStruc form_struc) { public JSONObject handler(List<String> param, JSONObject data, BmFormStruc form_struc) {
//数据平铺 //数据平铺
data.putAll(data.getJSONObject("form_data")); JSONObject forms = data.getJSONObject("form_data");
if (forms!=null){
data.putAll(forms);
}
//数据字段列表 //数据字段列表
List<String> fields = ListOf.of(form_struc.getBiz_code() List<String> fields = ListOf.of(form_struc.getBiz_code()
, form_struc.getBiz_id() , form_struc.getBiz_id()
@@ -39,25 +43,30 @@ public class MappingHandler extends TypeHandler<JSONObject, JSONObject> {
, form_struc.getPcsn() , form_struc.getPcsn()
, form_struc.getVehicle_code() , form_struc.getVehicle_code()
, form_struc.getQty()); , form_struc.getQty());
fields.addAll(form_struc.getForm_param().keySet());
//查询目标表字段 //查询目标表字段
JSONObject returnObj = new JSONObject(); JSONObject returnObj = new JSONObject();
//基础字段映射:如果只有一个就不迭代 //基础字段映射:如果只有一个就不迭代
JSONObject mapping = JSONObject.parseObject(param.size()==1?param.get(0):param.remove(0)); JSONObject mapping = JSONObject.parseObject(param.size()==1?param.get(0):param.remove(0));
for (String item : mapping.keySet()) { for (String field : fields) {
String value = data.getString(mapping.getString(item)); if (field!=null){
returnObj.put(item,value); String value = data.getString(mapping.getString(field));
returnObj.put(field,value);
}
} }
JSONObject formData = mapping.getJSONObject("form_data");
//查询表单配置表获取自定义json:自定义字段参数获取 //查询表单配置表获取自定义json:自定义字段参数获取
if (formData!=null){ JSONObject form_param = form_struc.getForm_param();
if (form_param!=null){
JSONObject form_data = new JSONObject(); JSONObject form_data = new JSONObject();
for (String item : formData.keySet()) { for (String item : form_param.keySet()) {
String value = data.getString(formData.getString(item)); String mappingConfig = mapping.getString(item);
if (StringUtils.isNotEmpty(mappingConfig)){
String value = data.getString(mappingConfig);
form_data.put(item,value); form_data.put(item,value);
} }
}
returnObj.put("form_data",form_data); returnObj.put("form_data",form_data);
} }
JSONArray item = data.getJSONArray("item"); JSONArray item = data.getJSONArray("item");
if (item!=null){ if (item!=null){
JSONArray itemList = new JSONArray(); JSONArray itemList = new JSONArray();

View File

@@ -32,6 +32,10 @@ public class ActReProcdef implements Serializable {
* 模型key * 模型key
*/ */
private String model_key; private String model_key;
/**
* 单据类型
*/
private String form_type;
/** /**
* 名称 * 名称

View File

@@ -14,7 +14,7 @@ import java.util.List;
**/ **/
public interface IFlowOperationService { public interface IFlowOperationService {
Boolean startUp(String form_type, JSONObject mst,List<JSONObject> items); Boolean startUp(String model_key, JSONObject mst, List<JSONObject> items);
Boolean startFormFlow(StartProcessInstanceVo params); Boolean startFormFlow(StartProcessInstanceVo params);

View File

@@ -1,13 +1,11 @@
package org.nl.wms.flow_manage.flow.service.execution.impl; package org.nl.wms.flow_manage.flow.service.execution.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.nl.common.domain.exception.BadRequestException; import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum; import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.IdUtil;
import org.nl.wms.flow_manage.flow.framework.BpmnModel; import org.nl.wms.flow_manage.flow.framework.BpmnModel;
import org.nl.wms.flow_manage.flow.framework.converter.BpmnJSONConverter; import org.nl.wms.flow_manage.flow.framework.converter.BpmnJSONConverter;
import org.nl.wms.flow_manage.flow.framework.engine.cmd.CommandExecutor; import org.nl.wms.flow_manage.flow.framework.engine.cmd.CommandExecutor;
@@ -46,8 +44,8 @@ public class FlowOperationServiceImpl implements IFlowOperationService {
private CommandExecutor commandExecutor; private CommandExecutor commandExecutor;
@Override @Override
public Boolean startUp(String form_type, JSONObject mst,List<JSONObject> items) { public Boolean startUp(String model_key, JSONObject mst, List<JSONObject> items) {
ActReProcdef deployment = actReProcdefService.getCurrentVersion(form_type); ActReProcdef deployment = actReProcdefService.getCurrentVersion(model_key);
if (deployment==null){ if (deployment==null){
throw new BadRequestException("当前单据类型未配置业务流程"); throw new BadRequestException("当前单据类型未配置业务流程");
} }
@@ -62,7 +60,7 @@ public class FlowOperationServiceImpl implements IFlowOperationService {
ExecutionEntity entity = new ExecutionEntity(); ExecutionEntity entity = new ExecutionEntity();
entity.setCurrentFlowElement(bpmnModel.getStartEvent()); entity.setCurrentFlowElement(bpmnModel.getStartEvent());
entity.setT(mst); entity.setT(mst);
entity.setForm_type(form_type); entity.setForm_type(deployment.getForm_type());
entity.setForm_id(mst.getString("id")); entity.setForm_id(mst.getString("id"));
entity.setStartActivityId(entity.getActivityId()); entity.setStartActivityId(entity.getActivityId());
entity.setDeploymentId(deployment.getDeployment_id()); entity.setDeploymentId(deployment.getDeployment_id());

View File

@@ -46,6 +46,7 @@ public class ActDeModelServiceImpl extends ServiceImpl<ActDeModelMapper, ActDeMo
procdef.setDeployment_id(IdUtil.getStringId()); procdef.setDeployment_id(IdUtil.getStringId());
procdef.setName(dto.getName()); procdef.setName(dto.getName());
procdef.setModel_key(dto.getModel_key()); procdef.setModel_key(dto.getModel_key());
procdef.setForm_type(dto.getForm_type());
procdef.setVersion(String.valueOf(dto.getVersion())); procdef.setVersion(String.valueOf(dto.getVersion()));
procdef.setDescription(dto.getDescription()); procdef.setDescription(dto.getDescription());
procdef.setModel_editor_json(dto.getModel_editor_json()); procdef.setModel_editor_json(dto.getModel_editor_json());

View File

@@ -82,7 +82,7 @@ public class MdGruopDickServiceImpl extends ServiceImpl<MdGruopDickMapper, MdGru
items.add(item); items.add(item);
} }
// iMdGroupMstService.save(mdGroupMst); // iMdGroupMstService.save(mdGroupMst);
iFlowOperationService.startUp("GROUP_MST",forms,items); iFlowOperationService.startUp("service_source_apply",forms,items);
} }
} }

View File

@@ -1,7 +1,13 @@
package org.nl.wms.pm_manage.form_data.controller; package org.nl.wms.pm_manage.form_data.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.nl.common.TableDataInfo;
import org.nl.common.domain.entity.PageQuery;
import org.nl.wms.config_manage.form_struc.service.IBmFormStrucService;
import org.nl.wms.pm_manage.form_data.service.IPmFormDataService; import org.nl.wms.pm_manage.form_data.service.IPmFormDataService;
import org.nl.wms.pm_manage.form_data.service.dao.PmFormData;
import org.nl.wms.pm_manage.form_data.service.dto.FormDataQuery;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@@ -24,7 +30,18 @@ import org.springframework.web.bind.annotation.RestController;
public class PmFormDataController { public class PmFormDataController {
@Autowired @Autowired
IPmFormDataService formDataService; private IPmFormDataService formDataService;
@GetMapping()
public ResponseEntity<Object> queryAll(FormDataQuery query, PageQuery page){
Page<PmFormData> result = formDataService.page(page.build(), query.build());
return new ResponseEntity<>(TableDataInfo.build(result),HttpStatus.CREATED);
}
@GetMapping("/sync/{type}") @GetMapping("/sync/{type}")
public ResponseEntity<Object> sync(@RequestParam String type, String formDtl){ public ResponseEntity<Object> sync(@RequestParam String type, String formDtl){

View File

@@ -67,12 +67,12 @@ public class PmFormData implements Serializable {
/** /**
* 创建id * 创建id
*/ */
private String update_time; private String create_time;
/** /**
* 创建id * 创建id
*/ */
private String update_name; private String create_name;
/** /**
* 物料id * 物料id
@@ -93,10 +93,6 @@ public class PmFormData implements Serializable {
*/ */
private String vehicle_code; private String vehicle_code;
/**
* 仓库
*/
private String stor_code;
/** /**
* 自定义表单字段 * 自定义表单字段

View File

@@ -0,0 +1,15 @@
package org.nl.wms.pm_manage.form_data.service.dto;
import lombok.Data;
import org.nl.common.domain.entity.BaseQuery;
import org.nl.wms.pm_manage.form_data.service.dao.PmFormData;
/*
* @author ZZQ
* @Date 2024/5/11 17:46
*/
@Data
public class FormDataQuery extends BaseQuery<PmFormData> {
private String from_type;
}

View File

@@ -9,7 +9,7 @@ spring:
driverClassName: com.mysql.cj.jdbc.Driver driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:wms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:wms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false
username: ${DB_USER:root} username: ${DB_USER:root}
password: ${DB_PWD:password} password: ${DB_PWD:123456}
# 初始连接数 # 初始连接数
initial-size: 5 initial-size: 5

View File

@@ -1,125 +1,125 @@
<template> <!--<template>-->
<el-dialog <!-- <el-dialog-->
title="导入Excel文件" <!-- title="导入Excel文件"-->
append-to-body <!-- append-to-body-->
:visible.sync="dialogVisible" <!-- :visible.sync="dialogVisible"-->
destroy-on-close <!-- destroy-on-close-->
width="400px" <!-- width="400px"-->
:show-close="true" <!-- :show-close="true"-->
@close="close" <!-- @close="close"-->
@open="open" <!-- @open="open"-->
> <!-- >-->
<el-upload <!-- <el-upload-->
ref="upload" <!-- ref="upload"-->
class="upload-demo" <!-- class="upload-demo"-->
action="" <!-- action=""-->
drag <!-- drag-->
:on-exceed="is_one" <!-- :on-exceed="is_one"-->
:limit="1" <!-- :limit="1"-->
:auto-upload="false" <!-- :auto-upload="false"-->
:multiple="false" <!-- :multiple="false"-->
:show-file-list="true" <!-- :show-file-list="true"-->
:on-change="uploadByJsqd" <!-- :on-change="uploadByJsqd"-->
:file-list="fileList" <!-- :file-list="fileList"-->
accept=".xlsx,.xls" <!-- accept=".xlsx,.xls"-->
> <!-- >-->
<i class="el-icon-upload" /> <!-- <i class="el-icon-upload" />-->
<div class="el-upload__text"> <!-- <div class="el-upload__text">-->
将文件拖到此处 <!-- 将文件拖到此处-->
<em>点击上传</em> <!-- <em>点击上传</em>-->
</div> <!-- </div>-->
<div slot="tip" class="el-upload__tip">只能上传Excel文件且不超过10MB</div> <!-- <div slot="tip" class="el-upload__tip">只能上传Excel文件且不超过10MB</div>-->
</el-upload> <!-- </el-upload>-->
<span slot="footer" class="dialog-footer"> <!-- <span slot="footer" class="dialog-footer">-->
<el-button @click="dialogVisible = false"> </el-button> <!-- <el-button @click="dialogVisible = false"> </el-button>-->
<el-button type="primary" @click="submit"> </el-button> <!-- <el-button type="primary" @click="submit"> </el-button>-->
</span> <!-- </span>-->
</el-dialog> <!-- </el-dialog>-->
</template> <!--</template>-->
<script> <!--<script>-->
import crudClassstandard from './classstandard' <!--import crudClassstandard from './classstandard'-->
import CRUD, { crud } from '@crud/crud' <!--import CRUD, { crud } from '@crud/crud'-->
import { download2 } from '@/api/data' <!--import { download2 } from '@/api/data'-->
import { downloadFile } from '@/utils' <!--import { downloadFile } from '@/utils'-->
export default { <!--export default {-->
name: 'UploadDialog', <!-- name: 'UploadDialog',-->
mixins: [crud()], <!-- mixins: [crud()],-->
components: {}, <!-- components: {},-->
props: { <!-- props: {-->
dialogShow: { <!-- dialogShow: {-->
type: Boolean, <!-- type: Boolean,-->
default: false <!-- default: false-->
}, <!-- },-->
openParam: { <!-- openParam: {-->
type: String <!-- type: String-->
} <!-- }-->
}, <!-- },-->
data() { <!-- data() {-->
return { <!-- return {-->
dialogVisible: false, <!-- dialogVisible: false,-->
fileList: [], <!-- fileList: [],-->
file1: '' <!-- file1: ''-->
} <!-- }-->
}, <!-- },-->
watch: { <!-- watch: {-->
dialogShow: { <!-- dialogShow: {-->
handler(newValue, oldValue) { <!-- handler(newValue, oldValue) {-->
this.dialogVisible = newValue <!-- this.dialogVisible = newValue-->
} <!-- }-->
}, <!-- },-->
openParam: { <!-- openParam: {-->
handler(newValue, oldValue) { <!-- handler(newValue, oldValue) {-->
this.opendtlParam = newValue <!-- this.opendtlParam = newValue-->
} <!-- }-->
} <!-- }-->
}, <!-- },-->
methods: { <!-- methods: {-->
open() { <!-- open() {-->
}, <!-- },-->
close() { <!-- close() {-->
this.$emit('update:dialogShow', false) <!-- this.$emit('update:dialogShow', false)-->
}, <!-- },-->
is_one() { <!-- is_one() {-->
this.crud.notify('只能上传一个excel文件', CRUD.NOTIFICATION_TYPE.WARNING) <!-- this.crud.notify('只能上传一个excel文件', CRUD.NOTIFICATION_TYPE.WARNING)-->
}, <!-- },-->
// 文件校验方法 <!-- // 文件校验方法-->
beforeAvatarUpload(file) { <!-- beforeAvatarUpload(file) {-->
// 不能导入大小超过2Mb的文件 <!-- // 不能导入大小超过2Mb的文件-->
if (file.size > 10 * 1024 * 1024) { <!-- if (file.size > 10 * 1024 * 1024) {-->
return false <!-- return false-->
} <!-- }-->
return true <!-- return true-->
}, <!-- },-->
// 文件发生改变就会触发的事件 <!-- // 文件发生改变就会触发的事件-->
uploadByJsqd(file) { <!-- uploadByJsqd(file) {-->
this.file1 = file <!-- this.file1 = file-->
}, <!-- },-->
submit() { <!-- submit() {-->
if (this.beforeAvatarUpload(this.file1)) { <!-- if (this.beforeAvatarUpload(this.file1)) {-->
this.fileList.name = this.file1.name <!-- this.fileList.name = this.file1.name-->
this.fileList.url = '' <!-- this.fileList.url = ''-->
var formdata = new FormData() <!-- var formdata = new FormData()-->
formdata.append('file', this.file1.raw) <!-- formdata.append('file', this.file1.raw)-->
// excelImport请求接口 formdata传递参数 <!-- // excelImport请求接口 formdata传递参数-->
crudClassstandard.excelImport(formdata).then((res) => { <!-- crudClassstandard.excelImport(formdata).then((res) => {-->
this.crud.notify('导入成功', CRUD.NOTIFICATION_TYPE.SUCCESS) <!-- this.crud.notify('导入成功', CRUD.NOTIFICATION_TYPE.SUCCESS)-->
this.$emit('tableChanged3', '') <!-- this.$emit('tableChanged3', '')-->
this.$emit('update:dialogShow', false) <!-- this.$emit('update:dialogShow', false)-->
}).catch(err => { <!-- }).catch(err => {-->
const list = err.response.data.message <!-- const list = err.response.data.message-->
download2('/api/produceWorkorder/download', list).then(result => { <!-- download2('/api/produceWorkorder/download', list).then(result => {-->
downloadFile(result, '错误信息汇总', 'xlsx') <!-- downloadFile(result, '错误信息汇总', 'xlsx')-->
crud.downloadLoading = false <!-- crud.downloadLoading = false-->
}) <!-- })-->
}) <!-- })-->
} else { <!-- } else {-->
this.crud.notify('文件过大请上传小于10MB的文件〜', CRUD.NOTIFICATION_TYPE.WARNING) <!-- this.crud.notify('文件过大请上传小于10MB的文件〜', CRUD.NOTIFICATION_TYPE.WARNING)-->
} <!-- }-->
} <!-- }-->
} <!-- }-->
} <!--}-->
</script> <!--</script>-->

View File

@@ -1,98 +0,0 @@
import request from '@/utils/request'
export function add(data) {
return request({
url: 'api/bmClassStandard',
method: 'post',
data
})
}
export function del(ids) {
return request({
url: 'api/bmClassStandard/',
method: 'delete',
data: ids
})
}
export function edit(data) {
return request({
url: 'api/bmClassStandard',
method: 'put',
data
})
}
export function getClass(params) {
return request({
url: 'api/bmClassStandard/loadClass',
method: 'get',
params
})
}
export function getClassSuperior(ids) {
const data = ids.length || ids.length === 0 ? ids : Array.of(ids)
return request({
url: 'api/bmClassStandard/superior',
method: 'post',
data
})
}
export function getClassSuperior2(ids) {
const data = ids.length || ids.length === 0 ? ids : Array.of(ids)
return request({
url: 'api/bmClassStandard/superior2',
method: 'post',
data
})
}
export function getClassType(params) {
return request({
url: 'api/bmClassStandard/getClass',
method: 'get',
params
})
}
export function queryClassById(params) {
return request({
url: 'api/bmClassStandard/queryClassById',
method: 'get',
params
})
}
// 传入分类标识和级别
export function getType(params) {
return request({
url: 'api/bmClassStandard/getType',
method: 'get',
params
})
}
export function getClassTable(params) {
return request({
url: 'api/bmClassStandard/getClassTable',
method: 'get',
params
})
}
export function getClassName() {
return request({
url: 'api/bmClassStandard/getClassName',
method: 'get'
})
}
export function excelImport(data) {
return request({
url: 'api/bmClassStandard/excelImport',
method: 'post',
data
})
}
export default { add, edit, del, getClass, getClassSuperior,getClassSuperior2, getClassType, getClassTable, getType, queryClassById, getClassName, excelImport }

View File

@@ -0,0 +1,35 @@
import request from '@/utils/request'
export function add(data) {
return request({
url: 'api/pmFormData',
method: 'post',
data
})
}
export function del(ids) {
return request({
url: 'api/pmFormData',
method: 'delete',
data: ids
})
}
export function edit(data) {
return request({
url: 'api/pmFormData',
method: 'put',
data
})
}
export function getFormType() {
return request({
url: 'api/bmFormStruc/getTypes',
method: 'get',
})
}
export default { add, edit, del, getFormType }

View File

@@ -11,18 +11,18 @@
label-width="90px" label-width="90px"
label-suffix=":" label-suffix=":"
> >
<el-form-item label="分类名称"> <el-form-item label="单据类型">
<el-select <el-select
v-model="query.class_code" v-model="query.form_type"
placeholder="请选择分类名称" placeholder="请选择单据类型"
clearable clearable
filterable filterable
size="mini" size="mini"
class="filter-item" class="filter-item"
style="width: 185px;" style="width: 185px;"
@change="hand"> >
<el-option <el-option
v-for="item in classNames" v-for="item in fromTypes"
:key="item.value" :key="item.value"
:label="item.label" :label="item.label"
:value="item.value"> :value="item.value">
@@ -40,7 +40,6 @@
size="mini" size="mini"
type="success" type="success"
icon="el-icon-s-operation" icon="el-icon-s-operation"
@click="ToExpandall"
> >
全部展开 全部展开
</el-button> </el-button>
@@ -50,56 +49,15 @@
type="warning" type="warning"
icon="el-icon-upload2" icon="el-icon-upload2"
size="mini" size="mini"
@click="uploadShow = true"
> >
导入 导入
</el-button> </el-button>
</crudOperation> </crudOperation>
<!--表单组件-->
<el-dialog
:close-on-click-modal="false"
:before-close="crud.cancelCU"
:visible.sync="crud.status.cu > 0"
:title="crud.status.title"
width="500px"
>
<el-form ref="form" :model="form" :rules="rules" size="mini" label-width="80px">
<el-form-item label="分类编码" prop="class_code">
<el-input v-model="form.class_code" style="width: 370px;" />
</el-form-item>
<el-form-item label="分类名称" prop="class_name">
<el-input v-model="form.class_name" style="width: 370px;" />
</el-form-item>
<el-form-item label="简要描述" prop="class_desc">
<el-input v-model="form.class_desc" style="width: 370px;" />
</el-form-item>
<el-form-item label="顶级类目">
<el-radio-group v-model="form.isTop" style="width: 140px">
<el-radio label="1">是</el-radio>
<el-radio label="0">否</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="form.isTop === '0'" style="margin-bottom: 0;" label="上级类目" prop="pid">
<treeselect
v-model="form.parent_class_id"
:load-options="loadClass"
:options="classes"
style="width: 370px;"
placeholder="选择上级类目"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="crud.cancelCU">取消</el-button>
<el-button :loading="crud.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
</div>
</el-dialog>
<!--表格渲染--> <!--表格渲染-->
<el-table <el-table
ref="table" ref="table"
v-loading="crud.loading" v-loading="crud.loading"
lazy lazy
:load="getClassDatas"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}" :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
:data="crud.data" :data="crud.data"
row-key="id" row-key="id"
@@ -107,12 +65,19 @@
@select-all="crud.selectAllChange" @select-all="crud.selectAllChange"
@selection-change="crud.selectionChangeHandler" @selection-change="crud.selectionChangeHandler"
> >
<el-table-column prop="class_code" label="分类编码" /> <el-table-column prop="code" label="单据编码" />
<el-table-column prop="class_name" label="分类名称" /> <el-table-column prop="form_type" label="单据类型" />
<el-table-column prop="class_desc" label="分类简要描述" /> <el-table-column prop="biz_code" label="业务单据编码" />
<el-table-column prop="update_optname" label="修改人" /> <el-table-column prop="biz_date" label="业务单据时间" />
<el-table-column prop="update_time" label="修改时间" /> <el-table-column prop="material_id" label="物料id" />
<el-table-column prop="is_modify" :formatter="modifyFormat" label="是否可修改" /> <el-table-column prop="pcsn" label="批次" />
<el-table-column prop="qty" label="物料数量" />
<el-table-column prop="vehicle_code" label="载具编号" />
<el-table-column prop="status" label="单据状态" />
<el-table-column prop="proc_inst_id" label="对应流程实例id" />
<el-table-column prop="parent_id" label="父单据数据id" />
<el-table-column prop="create_time" label="创建时间" />
<el-table-column <el-table-column
v-permission="['admin','Classstandard:edit','Classstandard:del']" v-permission="['admin','Classstandard:edit','Classstandard:del']"
label="操作" label="操作"
@@ -128,20 +93,18 @@
:disabled-dle="scope.row.is_modify === '0'" :disabled-dle="scope.row.is_modify === '0'"
msg="确定删除吗,如果存在下级节点则一并删除,此操作不能撤销!" msg="确定删除吗,如果存在下级节点则一并删除,此操作不能撤销!"
/> />
<el-button slot="right" size="mini" type="text" icon="el-icon-circle-plus-outline" @click="crud.toAddAndData(addSibling(scope.row))">新增同级</el-button>
<el-button slot="right" size="mini" type="text" icon="el-icon-circle-plus" @click="crud.toAddAndData(addChildren(scope.row))">新增子级</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<!--分页组件--> <!--分页组件-->
<pagination /> <pagination />
</div> </div>
<UploadDialog :dialog-show.sync="uploadShow" @tableChanged3="crud.toQuery()"/> <!-- <UploadDialog :dialog-show.sync="uploadShow" @tableChanged3="crud.toQuery()"/>-->
</div> </div>
</template> </template>
<script> <script>
import crudClassstandard from './classstandard' import crudFormData from './formData'
import CRUD, { crud, form, header, presenter } from '@crud/crud' import CRUD, { crud, form, header, presenter } from '@crud/crud'
import Treeselect, { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect' import Treeselect, { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css' import '@riophae/vue-treeselect/dist/vue-treeselect.css'
@@ -149,7 +112,7 @@ import crudOperation from '@crud/CRUD.operation'
import udOperation from '@crud/UD.operation' import udOperation from '@crud/UD.operation'
import rrOperation from '@crud/RR.operation' import rrOperation from '@crud/RR.operation'
import pagination from '@crud/Pagination' import pagination from '@crud/Pagination'
import UploadDialog from './UploadDialog' // import UploadDialog from './UploadDialog'
let defaultForm = { let defaultForm = {
class_id: null, class_id: null,
@@ -176,17 +139,17 @@ let defaultForm = {
isTop: '1' isTop: '1'
} }
export default { export default {
name: 'Classstandard', name: 'FormData',
dicts: ['base_data'], dicts: ['base_data'],
components: {UploadDialog, pagination, crudOperation, rrOperation, udOperation, Treeselect }, components: {pagination, crudOperation, rrOperation, udOperation, Treeselect },
mixins: [presenter(), header(), form(defaultForm), crud()], mixins: [presenter(), header(), form(defaultForm), crud()],
cruds() { cruds() {
return CRUD({ return CRUD({
title: '基础类别', title: '基础类别',
url: 'api/bmClassStandard', url: 'api/pmFormData',
idField: 'class_id', idField: 'id',
sort: 'class_id,desc', sort: 'id,desc',
crudMethod: { ...crudClassstandard }, crudMethod: { ...crudFormData },
optShow: { optShow: {
add: true, add: true,
reset: true reset: true
@@ -197,217 +160,23 @@ export default {
return { return {
classes: [], classes: [],
uploadShow: false, uploadShow: false,
classNames: [], fromTypes: [],
permission: {}, permission: {},
rules: { rules: {
class_id: [
{ required: true, message: '不能为空', trigger: 'blur' }
],
path_code: [
{ required: true, message: '不能为空', trigger: 'blur' }
],
class_code: [
{ required: true, message: '不能为空', trigger: 'blur' }
],
class_name: [
{ required: true, message: '不能为空', trigger: 'blur' }
],
is_leaf: [
{ required: true, message: '不能为空', trigger: 'blur' }
],
is_modify: [
{ required: true, message: '不能为空', trigger: 'blur' }
],
is_delete: [
{ required: true, message: '不能为空', trigger: 'blur' }
],
create_id: [
{ required: true, message: '不能为空', trigger: 'blur' }
],
create_name: [
{ required: true, message: '不能为空', trigger: 'blur' }
],
create_time: [
{ required: true, message: '不能为空', trigger: 'blur' }
]
} }
} }
}, },
created() { created() {
this.getClassNames() // 获取分类 this.getFromTypes()
this.crud.query.from_type = this.fromTypes[0].value
// 获取分类
}, },
methods: { methods: {
getClassNames() { getFromTypes() {
crudClassstandard.getClassName().then((res) => { // 获取分类名称,查询根据分类编码查找对应分支树 crudFormData.getFormType().then((res) => { // 获取分类名称,查询根据分类编码查找对应分支树
this.classNames = res this.fromTypes = res
}) })
}, },
getClassDatas(tree, treeNode, resolve) {
const params = { pid: tree.id }
setTimeout(() => {
crudClassstandard.getClass(params).then(res => {
resolve(res.content)
})
}, 100)
},
// 钩子在获取表格数据之前执行false 则代表不获取数据
[CRUD.HOOK.beforeRefresh]() {
return true
},
modifyFormat(row, index) {
if (row.is_modify === '1') {
return '是'
} else {
return '否'
}
},
dataTypeChange(data) {
crudClassstandard.getClass({ base_data_type: data }).then(res => {
this.classes = res.content.map(function(obj) {
if (obj.hasChildren) {
obj.children = null
}
return obj
})
})
},
// 新增与编辑前做的操作
[CRUD.HOOK.afterToCU](crud, form) {
if (form.parent_class_id !== '0' && form.parent_class_id !== null) {
form.isTop = '0'
} else if (form.class_id !== '0' && form.class_id !== null) {
form.isTop = '1'
}
form.enabled = `${form.enabled}`
if (form.class_id != null) {
this.getSubTypes(form.id)
} else {
this.getClass()
}
},
// 提交前的验证
[CRUD.HOOK.afterValidateCU]() {
// if (this.form.parent_class_id !== null && this.form.parent_class_id === this.form.class_id) {
// this.$message({
// message: '顶级类目不能为空',
// type: 'warning'
// })
// return false
// }
if (this.form.isTop === '1') {
this.form.parent_class_id = 0
}
return true
},
getSubTypes(id) {
crudClassstandard.getClassSuperior(id).then(res => {
const date = res.content
this.buildClass(date)
this.classes = date
})
},
getClass() {
crudClassstandard.getClass({ enabled: true }).then(res => {
this.classes = res.content.map(function(obj) {
if (obj.hasChildren) {
obj.children = null
}
return obj
})
})
},
buildClass(classes) {
classes.forEach(data => {
if (data.children) {
this.buildClass(data.children)
}
if (data.hasChildren && !data.children) {
data.children = null
}
})
},
// 获取弹窗内部门数据
loadClass({ action, parentNode, callback }) {
if (action === LOAD_CHILDREN_OPTIONS) {
crudClassstandard.getClass({ pid: parentNode.id }).then(res => {
parentNode.children = res.content.map(function(obj) {
if (obj.hasChildren) {
obj.children = null
}
return obj
})
setTimeout(() => {
callback()
}, 100)
})
}
},
clearFrom() {
defaultForm = {
id: null,
class_id: null,
base_data_type: null,
path_code: null,
class_code: null,
long_class_code: null,
class_name: null,
class_desc: null,
parent_class_id: null,
is_leaf: null,
sub_count: null,
is_modify: null,
is_delete: null,
class_level: null,
ext_id: null,
ext_parent_id: null,
create_id: null,
create_name: null,
create_time: null,
update_optid: null,
update_optname: null,
update_time: null,
isTop: null
}
},
addSibling(row) {
this.clearFrom() // 将默认的表单数据清除
defaultForm.id = row.id // 获取分类树的id - 懒加载依赖此id不可为空
defaultForm.class_id = row.class_id
defaultForm.parent_class_id = row.parent_class_id // 同级为父类class_id
defaultForm.isTop = row.isTop
return defaultForm
},
addChildren(row) {
this.clearFrom()
defaultForm.id = row.id // 获取分类树的id
defaultForm.class_id = row.parent_class_id
defaultForm.parent_class_id = row.id // 子级为本身的class_id
defaultForm.isTop = row.isTop
return defaultForm
},
// 全部展开 参考https://www.cnblogs.com/toughy/p/12667805.html
ToExpandall() {
const els = document.getElementsByClassName('el-table__expand-icon')
if (this.crud.data.length !== 0 && els.length !== 0) {
for (let j1 = 0; j1 < els.length; j1++) {
els[j1].classList.add('dafult')
}
if (this.$el.getElementsByClassName('el-table__expand-icon--expanded')) {
const open = this.$el.getElementsByClassName('el-table__expand-icon--expanded')
for (let j = 0; j < open.length; j++) {
open[j].classList.remove('dafult')
}
const dafult = this.$el.getElementsByClassName('dafult')
for (let a = 0; a < dafult.length; a++) {
dafult[a].click()
}
}
}
},
hand(value) {
this.crud.toQuery()
}
} }
} }
</script> </script>