Teamlinker/code/server/cooperation/mapper/field.ts
sx1989827 64276beb07 dev
2023-09-16 23:26:10 +08:00

519 lines
19 KiB
TypeScript

import {
ECommon_Model_Workflow_Node_Field_Type_Label_Type,
ICommon_Model_Workflow_Node_Field_Type,
workflowNodeFieldTypeModel
} from '../../../common/model/workflow_node_field_type';
import {
ICommon_Model_Workflow_Node_Field_Type_Config,
workflowNodeFieldTypeConfigModel
} from '../../../common/model/workflow_node_field_type_config';
import {Err} from '../../../common/status/error';
import {getMysqlInstance} from '../../common/db/mysql';
import {Mapper} from "../../common/entity/mapper";
import {
generateBatchCreateSql,
generateCreateSql,
generateDeleteSql,
generateMaxSql,
generateQuerySql,
generateSnowId,
generateUpdateSql
} from '../../common/util/sql';
import {ECommon_Field_Type, Field_Types, ICommon_Field_Type} from "../../../common/field/type";
import {projectIssueProcessModel} from "../../../common/model/project_issue_process";
import {
ICommon_Model_Project_Issue_Field_Value,
projectIssueFieldValueModel
} from "../../../common/model/project_issue_field_value";
class WorkflowNodeFieldTypeMapper extends Mapper<typeof workflowNodeFieldTypeModel> {
constructor() {
super(workflowNodeFieldTypeModel)
}
async workflowNodeFieldInfo(workflowNodeFieldTypeId:string):Promise<{
field:ICommon_Model_Workflow_Node_Field_Type,
fieldType:ICommon_Field_Type,
values?:ICommon_Model_Workflow_Node_Field_Type_Config[]
}> {
if(!workflowNodeFieldTypeId) {
throw Err.Project.Field.fieldSolutionWorkflowNodeFieldTypeNotFound
}
let mysql=getMysqlInstance()
let sql=generateQuerySql(workflowNodeFieldTypeModel,null,{
id:workflowNodeFieldTypeId
})
let objField=await mysql.executeOne(sql)
let objFieldType = Field_Types[objField.field_type_id]
let ret=<{
field:ICommon_Model_Workflow_Node_Field_Type,
fieldType:ICommon_Field_Type,
values?:ICommon_Model_Workflow_Node_Field_Type_Config[]
}>{
field: objField,
fieldType: objFieldType,
values: []
}
let arrValues = await mysql.execute(generateQuerySql(workflowNodeFieldTypeConfigModel, [], {
workflow_node_field_type_id: objField.id
}))
ret.values = arrValues
return ret;
}
async getWorkflowNodeFieldList(workflowNodeId:string):Promise<{
field:ICommon_Model_Workflow_Node_Field_Type,
fieldType:ICommon_Field_Type,
values?:ICommon_Model_Workflow_Node_Field_Type_Config[]
}[]> {
if(!workflowNodeId) {
throw Err.Project.Workflow.workflowNodeNotFound
}
let mysql=getMysqlInstance()
let sql=generateQuerySql(workflowNodeFieldTypeModel,null,{
workflow_node_id:workflowNodeId
},"and",{
field:"weight",
type:"asc"
})
let arrField=await mysql.execute(sql)
let ret:{
field:ICommon_Model_Workflow_Node_Field_Type,
fieldType:ICommon_Field_Type,
values?:ICommon_Model_Workflow_Node_Field_Type_Config[]
}[]=[]
let arrPromise=[]
for(let objField of arrField) {
let objFieldType=Field_Types[objField.field_type_id]
let obj:{
field:ICommon_Model_Workflow_Node_Field_Type,
fieldType:ICommon_Field_Type,
values?:ICommon_Model_Workflow_Node_Field_Type_Config[]
}={
field:objField,
fieldType:objFieldType,
values:[]
}
arrPromise.push((async ()=>{
ret.push(obj)
let arrValues=await mysql.execute(generateQuerySql(workflowNodeFieldTypeConfigModel,[],{
workflow_node_field_type_id:objField.id
}))
obj.values=arrValues
})())
}
await Promise.all(arrPromise)
return ret;
}
async addWorkflowNodeField(workflowNodeId:string,fieldTypeId:ECommon_Field_Type,name:string,optional:number,defaultStringValue?:string,defaultNumberValue?:number,description?:string):Promise<ICommon_Model_Workflow_Node_Field_Type> {
if(!workflowNodeId) {
throw Err.Project.Workflow.workflowNodeNotFound
} else if(fieldTypeId===undefined || fieldTypeId===null) {
throw Err.Project.Field.fieldTypeNotFound
}
let weight=0,mysql=getMysqlInstance()
let existSort=await mysql.executeOne(generateMaxSql(workflowNodeFieldTypeModel,"weight",{
workflow_node_id:workflowNodeId
}))
if(existSort && existSort.weight) {
weight=existSort.weight+1
}
let id=await generateSnowId()
await mysql.execute(generateCreateSql(workflowNodeFieldTypeModel,{
workflow_node_id:workflowNodeId,
id:id,
field_type_id:fieldTypeId,
name,
default_string_value:defaultStringValue,
default_number_value:defaultNumberValue,
optional,
description,
weight,
...((fieldTypeId===ECommon_Field_Type.LABEL || fieldTypeId===ECommon_Field_Type.MULTILABEL) && {
label_type:ECommon_Model_Workflow_Node_Field_Type_Label_Type.USER
})
}))
let arr=await mysql.execute(generateQuerySql(projectIssueProcessModel,["project_issue_id"],{
workflow_node_process:{
exp:"json_array_contain",
value:workflowNodeId
}
}))
if(arr.length>0) {
let arrCreate:ICommon_Model_Project_Issue_Field_Value[]=[]
for(let obj of arr) {
arrCreate.push({
id:await generateSnowId(),
workflow_node_field_type_id:id,
project_issue_id:obj.project_issue_id,
field_config_ids:null,
ref_values:null,
number_value:null,
string_value:null
})
}
await mysql.execute(generateBatchCreateSql(projectIssueFieldValueModel,arrCreate))
}
let ret=await mysql.executeOne(generateQuerySql(workflowNodeFieldTypeModel,[],{
id:id
}))
return ret;
}
async editWorkflowNodeFieldLabelType(workflowNodeFieldTypeId:string, labelType:number) {
if(!workflowNodeFieldTypeId) {
throw Err.Project.Field.fieldSolutionWorkflowNodeFieldTypeNotFound
}
let mysql=getMysqlInstance()
await mysql.execute(generateUpdateSql(workflowNodeFieldTypeModel,{
label_type:labelType
},{
id:workflowNodeFieldTypeId
}))
}
async deleteWorkflowNodeField(workflowNodeFieldTypeId:string) {
if(!workflowNodeFieldTypeId) {
throw Err.Project.Field.fieldSolutionWorkflowNodeFieldTypeNotFound
}
let mysql=getMysqlInstance()
let obj=await mysql.executeOne(generateQuerySql(workflowNodeFieldTypeModel,[],{
id:workflowNodeFieldTypeId
}))
if(obj) {
await Promise.all([
mysql.execute(generateDeleteSql(workflowNodeFieldTypeModel,{
id:workflowNodeFieldTypeId
})),
mysql.execute(generateDeleteSql(workflowNodeFieldTypeConfigModel,{
workflow_node_field_type_id:workflowNodeFieldTypeId
})),
mysql.execute(generateUpdateSql(workflowNodeFieldTypeModel,{
weight:{
exp:"-",
value:1
}
},{
workflow_node_id:obj.workflow_node_id,
weight:{
exp:">",
value:obj.weight
}
}))
])
}
}
async moveWorkflowNodeField(workflowNodeFieldTypeId:string, weight:number) {
if(!workflowNodeFieldTypeId) {
throw Err.Project.Field.fieldSolutionWorkflowNodeFieldTypeNotFound
}
let mysql=getMysqlInstance()
let obj=await mysql.executeOne(generateQuerySql(workflowNodeFieldTypeModel,[],{
id:workflowNodeFieldTypeId
}))
if(obj) {
if(weight>obj.weight) {
await mysql.execute(generateUpdateSql(workflowNodeFieldTypeModel,{
weight:{
exp:"-",
value:1
}
},{
workflow_node_id:obj.workflow_node_id,
weight:{
exp:"> <=",
value:[obj.weight,weight]
}
}))
await mysql.executeOne(generateUpdateSql(workflowNodeFieldTypeModel,{
weight: weight
},{
id:workflowNodeFieldTypeId
}))
} else if(weight<obj.weight) {
await mysql.execute(generateUpdateSql(workflowNodeFieldTypeModel,{
weight:{
exp:"+",
value:1
}
},{
workflow_node_id:obj.workflow_node_id,
weight:{
exp:">= <",
value:[weight,obj.weight]
}
}))
await mysql.executeOne(generateUpdateSql(workflowNodeFieldTypeModel,{
weight: weight
},{
id:workflowNodeFieldTypeId
}))
}
let ret=await mysql.executeOne(generateQuerySql(workflowNodeFieldTypeModel,[],{
id:workflowNodeFieldTypeId
}))
return ret;
} else {
return null;
}
}
async listWorkflowNodeFieldConfig(workflowNodeFieldTypeId:string):Promise<ICommon_Model_Workflow_Node_Field_Type_Config[]> {
if(!workflowNodeFieldTypeId) {
throw Err.Project.Field.fieldSolutionWorkflowNodeFieldTypeNotFound
}
let mysql=getMysqlInstance()
let ret=await mysql.execute(generateQuerySql(workflowNodeFieldTypeConfigModel,[],{
workflow_node_field_type_id:workflowNodeFieldTypeId
},"and",{
field:"weight",
type:"asc"
}))
return ret;
}
async addWorkflowNodeFieldConfig(workflowNodeFieldTypeId :string,value :string,selected :number,weight:number):Promise<ICommon_Model_Workflow_Node_Field_Type_Config> {
if(!workflowNodeFieldTypeId) {
throw Err.Project.Field.fieldSolutionWorkflowNodeFieldTypeNotFound
}
let mysql=getMysqlInstance()
let id=await generateSnowId()
await mysql.execute(generateCreateSql(workflowNodeFieldTypeConfigModel,{
id:id,
workflow_node_field_type_id:workflowNodeFieldTypeId,
value:value,
selected:selected,
weight:weight
}))
let ret=await mysql.executeOne(generateQuerySql(workflowNodeFieldTypeConfigModel,[],{
id
}))
return ret;
}
async getFieldByNodeFieldTypeId(workflowNodeFieldTypeId :string) {
if(!workflowNodeFieldTypeId) {
throw Err.Project.Field.fieldSolutionWorkflowNodeFieldTypeNotFound
}
let mysql=getMysqlInstance()
let ret=await mysql.executeOne(generateQuerySql(workflowNodeFieldTypeModel,[],{
id:workflowNodeFieldTypeId
}))
return ret;
}
async getFieldByFieldTypeConfigId(fieldTypeConfigValueId :string) {
if(!fieldTypeConfigValueId) {
throw Err.Project.Field.fieldTypeConfigValueIdNotFound
}
let mysql=getMysqlInstance()
let obj = await mysql.executeOne(generateQuerySql(workflowNodeFieldTypeConfigModel,[],{
id:fieldTypeConfigValueId
}))
if(!obj) {
throw Err.Project.Field.fieldTypeConfigValueIdNotFound
}
let ret=await mysql.executeOne(generateQuerySql(workflowNodeFieldTypeModel,[],{
id:obj.workflow_node_field_type_id
}))
return ret;
}
async checkFieldConfigValueSelectedExist(workflowNodeFieldTypeId:string) {
if(!workflowNodeFieldTypeId) {
throw Err.Project.Field.fieldSolutionWorkflowNodeFieldTypeNotFound
}
let mysql=getMysqlInstance()
let ret=await mysql.executeOne(generateQuerySql(workflowNodeFieldTypeConfigModel,[],{
workflow_node_field_type_id:workflowNodeFieldTypeId,
selected:1
}))
return !!ret;
}
async editWorkflowNodeFieldConfig(fieldTypeConfigValueId :string,value :string,selected :number,weight:number):Promise<ICommon_Model_Workflow_Node_Field_Type_Config> {
if(!fieldTypeConfigValueId) {
throw Err.Project.Field.fieldTypeConfigValueIdNotFound
}
let mysql=getMysqlInstance()
await mysql.execute(generateUpdateSql(workflowNodeFieldTypeConfigModel,{
value,
selected,
weight
},{
id:fieldTypeConfigValueId
}))
let ret=await mysql.executeOne(generateQuerySql(workflowNodeFieldTypeConfigModel,[],{
id:fieldTypeConfigValueId
}))
return ret;
}
async deleteConfigByFieldId(fieldTypeId :string) {
if(fieldTypeId===undefined ||fieldTypeId===null) {
throw Err.Project.Field.fieldTypeNotFound
}
let mysql=getMysqlInstance()
await mysql.execute(generateDeleteSql(workflowNodeFieldTypeConfigModel,{
workflow_node_field_type_id:fieldTypeId
}))
}
async deleteWorkflowNodeFieldConfigs(fieldTypeConfigValueIds :string[]) {
if(!fieldTypeConfigValueIds) {
throw Err.Project.Field.fieldTypeConfigValueIdNotFound
}
if(fieldTypeConfigValueIds.length>0) {
let mysql=getMysqlInstance()
await mysql.execute(generateDeleteSql(workflowNodeFieldTypeConfigModel,{
id:{
exp:"in",
value:fieldTypeConfigValueIds
}
}))
}
}
async workflowFieldsCopy(workflowNodeId:string,newWorkflowNodeId:string) {
if(!workflowNodeId) {
throw Err.Project.Workflow.workflowNodeNotFound
}
let mysql=getMysqlInstance()
let arrFields=await mysql.execute(generateQuerySql(workflowNodeFieldTypeModel,[],{
workflow_node_id:workflowNodeId
}))
let arrConfigValues:ICommon_Model_Workflow_Node_Field_Type_Config[]=[]
if(arrFields.length>0) {
arrConfigValues=await mysql.execute(generateQuerySql(workflowNodeFieldTypeConfigModel,[],{
workflow_node_field_type_id:{
exp:"in",
value:arrFields.map(item=>item.id)
}
}))
}
let objConfigValue=<{
[param:string]:ICommon_Model_Workflow_Node_Field_Type_Config[]
}>{}
for(let obj of arrConfigValues) {
obj.id=await generateSnowId()
if(objConfigValue[obj.workflow_node_field_type_id]) {
objConfigValue[obj.workflow_node_field_type_id].push(obj)
} else {
objConfigValue[obj.workflow_node_field_type_id]=[obj]
}
}
for(let obj of arrFields) {
let id=obj.id
obj.id=await generateSnowId()
obj.workflow_node_id=newWorkflowNodeId
if(objConfigValue[id]) {
for(let o of objConfigValue[id]) {
o.workflow_node_field_type_id=obj.id
}
}
}
if(arrFields && arrFields.length>0) {
await mysql.execute(generateBatchCreateSql(workflowNodeFieldTypeModel,arrFields))
let arr=await mysql.execute(generateQuerySql(projectIssueProcessModel,["project_issue_id"],{
workflow_node_process:{
exp:"json_array_contain",
value:newWorkflowNodeId
}
}))
if(arr.length>0) {
let arrCreate:ICommon_Model_Project_Issue_Field_Value[]=[]
for(let obj of arrFields) {
for(let objProjectIssue of arr) {
arrCreate.push({
id:await generateSnowId(),
workflow_node_field_type_id:obj.id,
project_issue_id:objProjectIssue.project_issue_id,
field_config_ids:null,
ref_values:null,
number_value:null,
string_value:null
})
}
}
await mysql.execute(generateBatchCreateSql(projectIssueFieldValueModel,arrCreate))
}
}
let arr:ICommon_Model_Workflow_Node_Field_Type_Config[]=[]
for(let id in objConfigValue) {
for(let obj of objConfigValue[id]) {
arr.push(obj)
}
}
if(arr.length>0) {
await mysql.execute(generateBatchCreateSql(workflowNodeFieldTypeConfigModel,arr))
}
}
async getFieldTypesByFieldIds(fieldIds:string[]):Promise<{
fieldId:string,
fieldType:ICommon_Field_Type
}[]> {
if(fieldIds.length==0) {
return []
}
let mysql=getMysqlInstance()
let sql=generateQuerySql(workflowNodeFieldTypeModel,null,{
id:{
exp:"in",
value:fieldIds
}
},"and",{
field:"id",
type:"field",
value:fieldIds
})
let arr=await mysql.execute(sql)
return arr.map(obj=>{
return {
fieldId:obj.id,
fieldType:Field_Types[obj.field_type_id]
}
});
}
async clearFieldByWorkflowNodeId(workflowNodeId:string){
let mysql=getMysqlInstance()
let arr=await mysql.execute(generateQuerySql(workflowNodeFieldTypeModel,["id"],{
workflow_node_id:workflowNodeId
}))
let arrPromise=[]
if(arr.length>0) {
arrPromise.push(mysql.execute(generateDeleteSql(workflowNodeFieldTypeModel, {
workflow_node_id: workflowNodeId
})))
arrPromise.push(mysql.execute(generateDeleteSql(workflowNodeFieldTypeConfigModel,{
workflow_node_field_type_id:{
exp:"in",
value:arr.map(item=>item.id)
}
})))
}
await Promise.all(arrPromise);
}
async setWorkflowNodeFieldsWeight(workflowNodeFieldTypeIds:string) {
if(!workflowNodeFieldTypeIds) {
return
}
let arr=workflowNodeFieldTypeIds.split(",")
let arrPromise=[]
let mysql=getMysqlInstance()
for(let i=0;i<arr.length;i++) {
arrPromise.push(mysql.execute(generateUpdateSql(workflowNodeFieldTypeModel,{
weight:i
},{
id:arr[i]
})))
}
await Promise.all(arrPromise)
}
}
export let workflowNodeFieldTypeMapper=new WorkflowNodeFieldTypeMapper