任务模块

dev_4newlayout
shiji 1 year ago
parent 09c0b6ee05
commit 7f99b77244
  1. 16
      ant-design-vue-jeecg/src/views/functionx/modules/FunctionxForm.vue
  2. 6
      ant-design-vue-jeecg/src/views/functionx/modules/FunctionxModal__Style#Drawer.vue
  3. 11
      ant-design-vue-jeecg/src/views/rulex/modules/RulexForm.vue
  4. 6
      ant-design-vue-jeecg/src/views/rulex/modules/RulexModal__Style#Drawer.vue
  5. 290
      ant-design-vue-jeecg/src/views/task/modules/TaskForm.vue
  6. 204
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/task/controller/TaskController.java
  7. 43
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/taskType/controller/TaskTypeController.java
  8. 24
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/taskType/entity/dto/TypeDto.java

@ -451,6 +451,22 @@ export default {
add() {
this.edit(this.modelDefault)
},
add1 (moduleId) {
console.log(moduleId+"--------------------")
getAction(this.url.getmoduleid,{id:moduleId}).then((res)=>{
if (res.success) {
this.moduleid=res.result.id;
this.model.moduleId=res.result.id;
//
this.modulebianma(this.moduleid);
this.modelDefault = JSON.parse(JSON.stringify(this.model));
this.edit(this.modelDefault);
}else{
this.$message.warning(res.message);
}
});
},
edit(record) {
this.model = Object.assign({}, record)
if (this.model.functionName1 != null) {

@ -39,6 +39,12 @@
this.$refs.realForm.add();
})
},
add1 (moduleId) {
this.visible=true
this.$nextTick(()=>{
this.$refs.realForm.add(moduleId);
})
},
edit (record) {
this.visible=true
this.$nextTick(()=>{

@ -216,6 +216,17 @@ export default {
add() {
this.edit(this.modelDefault);
},
add1(functionId,moduleId) {
this.functionId=functionId;
this.model.functionId=functionId;
this.moduleId=moduleId;
this.model.moduleId=moduleId;
this.sort();
this.shiti();
this.modelDefault = JSON.parse(JSON.stringify(this.model));
this.edit(this.modelDefault);
},
edit(record) {
this.model = Object.assign({}, record);
this.visible = true;

@ -39,6 +39,12 @@
this.$refs.realForm.add();
})
},
add1 (functionId,moduleId) {
this.visible=true
this.$nextTick(()=>{
this.$refs.realForm.add1(functionId,moduleId);
})
},
edit (record) {
this.visible=true
this.$nextTick(()=>{

@ -4,28 +4,71 @@
<a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
<a-row>
<a-col :span="24">
<a-form-model-item label="上级任务" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="upperName">
<j-popup
v-model="model.upperTaskName"
field="upperTaskName"
org-fields="id,task_name"
dest-fields="upperId,upperTaskName"
code="taskname"
:multi="true"
@input="popupCallback"
/>
</a-form-model-item>
</a-col>
<!-- <a-col :span="24">-->
<!-- <a-form-model-item label="上级任务" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="upperId">-->
<!-- <j-dict-select-tag v-model="model.upperId" placeholder="请选择所属上级任务"-->
<!-- :dict-code="task" style="width: 100%">-->
<!-- </j-dict-select-tag>-->
<!-- </a-form-model-item>-->
<!-- </a-col>-->
<a-col :span="24" style="display: none;">
<a-form-model-item label="上级任务" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="upperId">
<j-dict-select-tag v-model="model.upperId" placeholder="请选择所属上级任务"
dict-code="task,task_name,id" style="width: 100%">
</j-dict-select-tag>
<a-input v-model="model.upperId" placeholder="请选择所属上级任务"></a-input>
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="任务层级" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="level">
<a-form-model-item label="任务等级" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="workLevel">
<!-- <a-input-number :min="1" :max="16" v-model="model.workLevel" placeholder="请输入任务等级" style="width: 100%" />-->
<j-dict-select-tag v-model="model.workLevel" type="radio" placeholder="请选择任务等级" dict-code="workLevel" style="width: 100%">
</j-dict-select-tag>
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-col >
<a-form-model-item label="任务层级" :labelCol="labelCol1" :wrapperCol="wrapperCol1" prop="level">
<j-dict-select-tag v-model="model.level" type="radio" style="width: 100%" dictCode="task_type_level"/>
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="任务类型" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="typeId">
<j-dict-select-tag v-model="model.typeId" type="radio" style="width: 100%"
dict-code="task_type,type_name,id"/>
</a-row>
<a-row>
<a-col >
<a-form-model-item label="任务类型" :labelCol="labelCol1" :wrapperCol="wrapperCol1" prop="typeId">
<!-- <j-dict-select-tag v-model="model.typeId" type="radio" style="width: 100%" dict-code="task_type,type_name,id"/> -->
<div v-for="item in options" :key="item.id" class="a">
<span style="margin-right: 10px;" class="B">{{ item.type_Name }} </span>
<a-radio-group v-model="model.typeId" :key="`children-${item.id}`" >
<a-radio v-for="child in item.children" :key="child.id" :value="child.id">
<span>{{ child.type_Name }}</span>
</a-radio>
</a-radio-group>
</div>
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-col :span="24">
<a-form-model-item label="项目" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="projectId">
<j-dict-select-tag v-model="model.projectId" placeholder="请选择项目" dict-code="projectx,project_name,id"
style="width: 100%" :disabled="model.typeId==null"
@change="fillTaskName">
<j-dict-select-tag
v-model="model.projectId"
placeholder="请选择项目"
dict-code="projectx,project_name,id"
style="width: 100%"
:disabled="model.typeId==null"
@change="fillTaskName" >
</j-dict-select-tag>
</a-form-model-item>
</a-col>
@ -42,86 +85,88 @@
auto-size />
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="责任人" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="managerUsers">
<j-multi-select-tag type="list_multi" v-model="model.managerUsers" dictCode="sys_user,realname,id" placeholder="请选择责任人"/>
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="模块" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="moduleId">
<!-- <a-input v-model="model.moduleId" placeholder="请输入模块" ></a-input>-->
<j-dict-select-tag v-model="model.moduleId" placeholder="请选择模块" dict-code="modulex,module_name,id"
style="width: 100%"></j-dict-select-tag>
<!-- <a-input v-model="model.moduleId" placeholder="请输入模块" modulex,module_name,id></a-input>-->
<j-dict-select-tag v-model="model.moduleId" placeholder="请选择模块" :dict-code="this.modulex"
style="width: 80%" @change="fillModuleName()"></j-dict-select-tag>
<a-button @click="handleAdd3" type="primary" icon="plus" style="width: 20%;"></a-button>
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="功能" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="functionId">
<!-- <a-input v-model="model.functionId" placeholder="请输入功能id" ></a-input>-->
<!-- <a-input v-model="model.functionId" placeholder="请输入功能id" functionx,function_name,id></a-input>-->
<j-dict-select-tag v-model="model.functionId" placeholder="请选择功能"
dict-code="functionx,function_name,id"
style="width: 100%"></j-dict-select-tag>
:dict-code="functionx"
style="width: 80%" @change="fillFunctionName()"></j-dict-select-tag>
<a-button @click="handleAdd1(model.moduleId)" type="primary" icon="plus" style="width: 20%;" ></a-button>
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="规则" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="ruleId">
<!-- <a-input v-model="model.ruleId" placeholder="请输入规则id" ></a-input>-->
<j-dict-select-tag v-model="model.ruleId" placeholder="请选择规则" dict-code="rulex,rule_no,id"
style="width: 100%"></j-dict-select-tag>
<!-- <a-input v-model="model.ruleId" placeholder="请输入规则id" rulex,rule_no,id></a-input>-->
<j-dict-select-tag v-model="model.ruleId" placeholder="请选择规则" :dict-code="rulex"
style="width: 80%"></j-dict-select-tag>
<a-button @click="handleAdd2(model.functionId,model.moduleId)" type="primary" icon="plus" style="width: 20%;"></a-button>
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="责任人" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="managerUsers">
<j-multi-select-tag type="list_multi" v-model="model.managerUsers"
dictCode="sys_user,realname,id" placeholder="请选择责任人"/>
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="任务等级" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="workLevel">
<!-- <a-input-number :min="1" :max="16" v-model="model.workLevel" placeholder="请输入任务等级" style="width: 100%" />-->
<j-dict-select-tag v-model="model.workLevel" type="radio" placeholder="请选择任务等级"
dict-code="workLevel" style="width: 100%">
</j-dict-select-tag>
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="任务状态" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="workStatus">
</a-row>
<a-row>
<a-col >
<a-form-model-item label="任务状态" :labelCol="labelCol1" :wrapperCol="wrapperCol1" prop="workStatus">
<!-- <a-input-number :min="1" :max="16" v-model="model.workStatus" placeholder="请输入任务状态" style="width: 100%" />-->
<j-dict-select-tag v-model="model.workStatus" type="radio" dict-code="task_work_status"
placeholder="请选择任务状态" style="width: 100%"/>
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-col>
<a-form-model-item label="任务描述" :labelCol="labelCol2" :wrapperCol="wrapperCol2" prop="taskDescribe">
<!-- <a-input type="textarea" v-model="model.taskDescribe" :rows="2"/> -->
<j-editor v-model="model.taskDescribe"/>
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-col :span="24">
<a-form-model-item label="发布时间" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="publishTime">
<!-- <j-date placeholder="请选择发布时间" v-model="model.publishTime" style="width: 100%"/>-->
<a-date-picker showTime valueFormat="YYYY-MM-DD HH:mm:ss" v-model="model.publishTime"/>
<a-date-picker showTime valueFormat="YYYY-MM-DD HH:mm:ss" v-model="model.startTime" style="width: 100%"/>
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="开始时间" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="startTime">
<!-- <j-date placeholder="请选择开始时间" v-model="model.startTime" style="width: 100%"/>-->
<a-date-picker showTime valueFormat="YYYY-MM-DD HH:mm:ss" v-model="model.startTime"/>
<a-form-model-item label="预计结束时间" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="expectedEndTime">
<!-- <j-date placeholder="请选择预计结束时间" v-model="model.expectedEndTime" style="width: 100%"/>-->
<a-date-picker showTime valueFormat="YYYY-MM-DD HH:mm:ss" v-model="model.expectedEndTime" style="width: 100%"/>
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="预计结束时间" :labelCol="labelCol" :wrapperCol="wrapperCol"
prop="expectedEndTime">
<!-- <j-date placeholder="请选择预计结束时间" v-model="model.expectedEndTime" style="width: 100%"/>-->
<a-date-picker showTime valueFormat="YYYY-MM-DD HH:mm:ss" v-model="model.expectedEndTime"/>
<a-form-model-item label="预计时长" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="expectedDuration">
<a-input-number v-model="model.expectedDuration" placeholder="请输入预计时长" style="width: 100%"/>
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="预计任务时长" :labelCol="labelCol" :wrapperCol="wrapperCol"
prop="expectedDuration">
<a-input-number v-model="model.expectedDuration" placeholder="请输入预计任务时长" style="width: 100%"/>
<a-form-model-item label="实际时长" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="realDuration">
<a-input-number v-model="model.realDuration" placeholder="请输入实际时长" style="width: 100%"/>
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="提交时间" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="submitTime">
<!-- <j-date placeholder="请选择提交时间" v-model="model.submitTime" style="width: 100%"/>-->
<a-date-picker showTime valueFormat="YYYY-MM-DD HH:mm:ss" v-model="model.submitTime"/>
<a-form-model-item label="开始时间" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="startTime">
<!-- <j-date placeholder="请选择开始时间" v-model="model.startTime" style="width: 100%"/>-->
<a-date-picker showTime valueFormat="YYYY-MM-DD HH:mm:ss" v-model="model.startTime" style="width: 100%"/>
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="实际任务时长" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="realDuration">
<a-input-number v-model="model.realDuration" placeholder="请输入实际任务时长" style="width: 100%"/>
<a-form-model-item label="提交时间" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="submitTime">
<!-- <j-date placeholder="请选择提交时间" v-model="model.submitTime" style="width: 100%"/>-->
<a-date-picker showTime valueFormat="YYYY-MM-DD HH:mm:ss" v-model="model.submitTime" style="width: 100%"/>
</a-form-model-item>
</a-col>
<a-col :span="24">
@ -130,16 +175,18 @@
<j-image-upload bizPath="scott/pic" v-model="model.taskPic"></j-image-upload>
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-col :span="24">
<a-form-model-item label="任务描述" style="width: 700px" prop="taskDescribe">
<a-input type="textarea" v-model="model.taskDescribe" :rows="2"/>
<a-form-model-item label="项目文件" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="taskPic">
<!-- <a-input v-model="model.taskPic" placeholder="请输入项目图片"></a-input>-->
<j-upload bizPath="temp/" v-model="model.taskFile"></j-upload>
</a-form-model-item>
</a-col>
</a-row>
</a-form-model>
</j-form-container>
<modulex-modal ref="modalForm3" @ok="modalFormOk"></modulex-modal>
<functionx-modal ref="modalForm1" @ok="modalFormOk"></functionx-modal>
<rulex-modal ref="modalForm2" @ok="modalFormOk"></rulex-modal>
</a-spin>
</template>
@ -150,12 +197,23 @@ import {httpAction, getAction} from '@api/manage'
import {validateDuplicateValue} from '@/utils/util'
import JVxeDateCell from "@comp/jeecg/JVxeTable/components/cells/JVxeDateCell";
import JMultiSelectTag from "@/components/dict/JMultiSelectTag"
import TaskModal from "@views/task/modules/TaskModal.vue";
import {JeecgListMixin} from '@/mixins/JeecgListMixin'
import {mixinDevice} from "@/utils/mixin";
import modulexModal from "@views/modulex/modules/ModulexModal__Style#Drawer.vue";
import FunctionxModal from "@views/functionx/modules/FunctionxModal__Style#Drawer.vue";
import RulexModal from "@views/rulex/modules/RulexModal__Style#Drawer.vue";
export default {
name: 'TaskForm',
mixins: [JeecgListMixin, mixinDevice],
components: {
RulexModal,
FunctionxModal,
modulexModal,
TaskModal,
JVxeDateCell,
JMultiSelectTag
JMultiSelectTag,
},
props: {
//
@ -167,6 +225,12 @@ export default {
},
data() {
return {
modulex: "modulex,module_name,id",
functionx: "functionx,function_name,id",
rulex: "rulex,rule_no,id",
task: "task,task_name,id",
value: new Date(),
model: {
workLevel: 2,
workStatus: 0,
@ -175,14 +239,49 @@ export default {
expectedDuration: 1,
// curryUserName: '',
},
options: [],
// labelCol: {
// xs: {span: 24},
// sm: {span: 5},
// },
// wrapperCol: {
// xs: {span: 24},
// sm: {span: 16},
// },
labelCol: {
xs: {span: 24},
sm: {span: 5},
xs: {span: 23},
sm: {span: 6},
},
wrapperCol: {
xs: {span: 24},
sm: {span: 16},
},
//
labelCol1: {
xs: {span: 24},
sm: {span: 3},
},
wrapperCol1: {
xs: {span: 24},
sm: {span: 21},
},
//
labelCol2: {
xs: {span: 24},
sm: {span: 3},
},
wrapperCol2: {
xs: {span: 24},
sm: {span: 20},
},
labelCol3: {
xs: {span: 24},
sm: {span: 7},
},
wrapperCol3: {
xs: {span: 24},
sm: {span: 15},
},
confirmLoading: false,
validatorRules: {
taskName: [
@ -227,6 +326,7 @@ export default {
// queryTaskTypeById: "/taskType/taskType/queryById",
fillTaskName: "/task/task/fillTaskName",
list: "/task/task/list",
listtasktype: '/taskType/taskType/getTypeMap'
}
}
@ -240,8 +340,22 @@ export default {
created() {
//model
this.modelDefault = JSON.parse(JSON.stringify(this.model));
this.tasktype()
},
methods: {
tasktype() {
getAction(this.url.listtasktype).then((res) => {
const data = res.result;
this.options = Object.entries(data).map(([key, value]) => {
const item = JSON.parse(key);
item.children = value;
return item;
})
})
},
popupCallback(value,row){
this.model = Object.assign(this.model, row);
},
handleCheckChange(data, checked, tree) {
if (checked) {
this.currentNodeData.id = data.id
@ -255,6 +369,8 @@ export default {
}
,
fillTaskName() {
this.modulex = "modulex,module_name,id,project_id='"+this.model.projectId+"'";
let that = this;
let fillTaskName = "";
let param = {
@ -280,7 +396,38 @@ export default {
}
}
,
fillLevelName(){
this.task = "task,task_name,id,level='"+this.model.level+"'";
}
,
handleAdd3: function () {
this.$refs.modalForm3.add();
this.$refs.modalForm3.title = "新增";
this.$refs.modalForm3.disableSubmit = false;
},
// handleAdd1: function (moduleId) {
// console.log(this.moduleId,'1111')
// this.$refs.modalForm1.add();
// this.$refs.modalForm1.title = "";
// this.$refs.modalForm1.disableSubmit = false;
// },
handleAdd1(moduleId){
console.log(moduleId+"22222222222222")
this.$refs.modalForm1.add1(moduleId)
this.$refs.modalForm1.title = "新增";
this.$refs.modalForm1.disableSubmit = false;
},
handleAdd2: function (functionId,moduleId) {
this.$refs.modalForm2.add1(functionId,moduleId);
this.$refs.modalForm2.title = "新增";
this.$refs.modalForm2.disableSubmit = false;
},
fillModuleName() {
this.functionx = "functionx,function_name,id,module_id='"+this.model.moduleId+"'";
},
fillFunctionName(){
this.rulex = "rulex,rule_no,id,function_id='"+this.model.functionId+"'";
},
//
getProjectNum() {
const projectTime = new Date() //
@ -350,4 +497,19 @@ export default {
,
}
}
</script>
</script>
<style lang="less" scoped>
.a{
display: flex;
flex-direction: row;
flex-wrap:wrap;
align-items: baseline;
}
.B{
width: 10%;
}
::v-deep .ant-radio-group{
width: 85%;
}
</style>

@ -39,6 +39,7 @@ import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
@ -60,6 +61,14 @@ public class TaskController extends JeecgController<Task, ITaskService> {
private static final String ADMIN = "admin";
private static final String FORMAT = "yyyy/MM/dd HH:mm:ss";
private static final long DAYWORKTIME = 35*60*60*100*2;
private static final long DAYTIME = 24*60*60*1000;
private static final String MORINGSTART = " 08:30:00";
private static final String MORINGEND = " 12:00:00";
private static final String AFTERNOONSTART = " 14:30:00";
private static final String AFTERNOONEND= " 18:00:00";
@Resource
private IProjectxService iProjectxService;
@ -358,15 +367,206 @@ public class TaskController extends JeecgController<Task, ITaskService> {
taskService.updateById(task);
return Result.OK("编辑成功!");
}
/**
* 提交任务更新状态同时计算实际任务时长
* 计算一整天之后算头和尾时间
* @param task
* @return
*/
@ApiOperation(value = "任务管理-更新状态", notes = "任务管理-更新状态")
@PutMapping(value = "/updateWorkStatus")
public Result<?> updateWorkStatus(@RequestBody Task task) {
task.setUpdateTime(new Date());
Date time = new Date();
if (task.getWorkStatus() == 3){
//获取数据
Task oldTask = taskService.query().eq("id", task.getId()).one();
Date startTime = oldTask.getStartTime();
long realTime = 0;
try {
realTime = realDuration(startTime, time);
} catch (ParseException e) {
throw new RuntimeException(e);
}
//设置更新数据
double realTimeHour = (double)realTime/(60*60*1000);
realTimeHour = new BigDecimal(realTimeHour).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
task.setRealDuration(realTimeHour);
task.setSubmitTime(time);
}
task.setUpdateTime(time);
taskService.updateById(task);
return Result.OK("编辑成功!");
}
//计算真实时间, 单位:小时
private long realDuration(Date startTime, Date endTime) throws ParseException {
long workTime = 0;
long millisecond = endTime.getTime() - startTime.getTime();
//统计整天时间
workTime += (millisecond / DAYTIME) * DAYWORKTIME;
millisecond = millisecond % DAYTIME;
SimpleDateFormat sdf1 = new SimpleDateFormat("HH:mm:ss");
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String time = dateFormat.format(new Date());
String start = sdf1.format(startTime);
String time0 = time + " " + start;
startTime = sdf.parse(time0);
String time1 = time + MORINGSTART;
String time2 = time + MORINGEND;
String time3 = time + AFTERNOONSTART;
String time4 = time + AFTERNOONEND;
Date date3 = sdf.parse(time3);
Date date2 = sdf.parse(time2);
Date date1 = sdf.parse(time1);
Date date4 = sdf.parse(time4);
//从start往后推到end,要判断大量情况
if (startTime.compareTo(endTime) > 0){
//时间跨度两天,但总时间不超过24小时
if (startTime.compareTo(date1) <= 0)
startTime = date1; //任务发布在8点前,从8点开始算
if (startTime.compareTo(date2) <= 0){
//早上有工作时间
workTime += date2.getTime() - startTime.getTime();
//跨度两天,下午必有任务时间
workTime += DAYWORKTIME/2;
//第二天下午必没有工作时间,判断第二天早上是否有部分工作时间
if (endTime.compareTo(date1) > 0)
workTime += endTime.getTime() - date1.getTime(); //第二天早上有工作时间
return workTime; //计算完成,返回结果
}
//上午没有工作时间
if (startTime.compareTo(date3) <= 0)
startTime = date3; //任务发布时间在12点后,14点前
if (startTime.compareTo(date4) <= 0) //下午有工作时间
workTime += date4.getTime() - startTime.getTime();
if (endTime.compareTo(date1) <= 0)
return workTime; //第二天没有工作时间
if (endTime.compareTo(date2) <= 0){
workTime += endTime.getTime() - date1.getTime(); //第二天上午有部分工作时间
return workTime; //必然下午没有工作时间
}
workTime += DAYWORKTIME/2; //第二天上午工作时间占满
if (endTime.compareTo(date3) <= 0)
return workTime; //下午没有工作时间
if (endTime.compareTo(date4) >= 0)
endTime = date4; //下午干满了
workTime += endTime.getTime() - date3.getTime();
return workTime;
}else {
//时间跨度没有超过两天
if (startTime.compareTo(date1) <= 0)
startTime = date1; //发布任务在8点之前
if (startTime.compareTo(date2) <= 0){
//上午发布的任务
if (endTime.compareTo(date2) <= 0){
//上午提交的任务
workTime += endTime.getTime() - startTime.getTime();
return workTime;
}
workTime += date2.getTime() - startTime.getTime(); //上午没有提交任务
if (endTime.compareTo(date3) <= 0)
return workTime; //中午12点后14点前提交任务
if (endTime.compareTo(date4) >= 0)
endTime = date4; //时间偏移
workTime += endTime.getTime() - date3.getTime(); //下午工作时间
}else {
//下午发布的任务
if (startTime.compareTo(date3) <= 0)
startTime = date3; //12点之后,14点之前发布任务
if (endTime.compareTo(date4) >= 0)
endTime = date4; //时间偏移
workTime += endTime.getTime() - startTime.getTime();
}
return workTime;
}
}
/**
* 计算预计结束时间
* @param task
* @return
*/
@GetMapping("/estimateTime")
public Result<?> calculating(Task task){
if (task.getStartTime() == null || task.getExpectedDuration() == null)
return Result.error("参数不足,无法计算预计结束时间");
Date date = null;
try {
date = estimateTime(task.getStartTime(), task.getExpectedDuration());
} catch (ParseException e) {
throw new RuntimeException(e);
}
return Result.OK(date);
}
/**
* 计算预计结束时间方法
* @param startTime
* @param expectedDuration
* @return
*/
private Date estimateTime(Date startTime, Double expectedDuration) throws ParseException {
long millisecond = (long) (expectedDuration * 60 * 60 * 1000);
//整天偏移量
int offset = (int) (millisecond / DAYWORKTIME);
//剩余工作量
millisecond = millisecond % DAYWORKTIME;
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String time = dateFormat.format(startTime);
String time1 = time + MORINGSTART;
String time2 = time + MORINGEND;
String time3 = time + AFTERNOONSTART;
String time4 = time + AFTERNOONEND;
Date date3 = sdf.parse(time3);
Date date2 = sdf.parse(time2);
Date date1 = sdf.parse(time1);
Date date4 = sdf.parse(time4);
long tempTime = 0;
if (startTime.compareTo(date1) <= 0)
startTime = date1; //任务发布在8点半之前,修正时间
if (startTime.compareTo(date2) < 0){
//上午发布任务
tempTime = date2.getTime() - startTime.getTime();
if (tempTime >= millisecond)
return new Date(startTime.getTime() + millisecond + DAYTIME*offset); //预计上午结束,直接偏移剩余时间
//上午剩余时间全部工作,时间进行修正到下午工作开始时间
millisecond -= tempTime;
startTime = date3;
}
if (startTime.compareTo(date3) <= 0)
startTime = date3; //任务是下午发布且在2点半之前,修正时间
if (startTime.compareTo(date4) < 0){
//下午发布任务
tempTime = date4.getTime() - startTime.getTime();
if (tempTime >= millisecond)
return new Date(startTime.getTime() + millisecond + DAYTIME*offset);
}
//时间修正,天数偏移量加1,到这里有两中情况,1、白天工作时间不足抵消 2、下午6点之后发布任务
offset ++;
startTime = date1;
tempTime = date2.getTime() - date1.getTime();
if (tempTime >= millisecond)
return new Date(startTime.getTime() + millisecond + DAYTIME*offset);
//上午偏移不足,下午一定够,因为不会跨两天
millisecond -= tempTime;
return new Date(startTime.getTime() + millisecond + DAYTIME*offset);
}
/**
* 通过id删除
*

@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@ -18,6 +20,7 @@ import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.taskType.entity.TaskType;
import org.jeecg.modules.taskType.entity.dto.TypeDto;
import org.jeecg.modules.taskType.service.ITaskTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@ -25,8 +28,7 @@ import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;
import java.util.*;
/**
* @Description: 任务类型管理
@ -41,9 +43,44 @@ import java.util.List;
public class TaskTypeController extends JeecgController<TaskType, ITaskTypeService> {
@Autowired
private ITaskTypeService taskTypeService;
@Autowired
private ObjectMapper objectMapper;
private static final String ADMIN_COLUMN_KEY = "99";
/**
* 查询所有项目类型并根据pid分类
* @return
*/
@GetMapping("/getTypeMap")
public Result<?> getMapType(){
Map<String, List<TypeDto>> listMap = new HashMap<>();
List<TaskType> hasChild = taskTypeService.query().eq("has_child", "1").list();
if (hasChild == null || hasChild.size() == 0)
return Result.error("查询任务类型失败");
for (TaskType taskType : hasChild) {
//准备map的key
String typeName = taskType.getTypeName();
String id = taskType.getId();
TypeDto typeDto = new TypeDto(id, typeName);
//准备map的value
List<TaskType> list = taskTypeService.query().eq("pid", id).list();
List<TypeDto> typeDtoList = new ArrayList<>(list.size());
for (TaskType type : list)
typeDtoList.add(new TypeDto(type.getId(), type.getTypeName()));
//放入数据到map
String key = null;
try {
key = objectMapper.writeValueAsString(typeDto);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
listMap.put(key, typeDtoList);
}
return Result.OK(listMap);
}
@ApiOperation(value = "文章栏目-分页列表查询", notes = "文章栏目-分页列表查询")
@GetMapping(value = "/rootList")
public Result<?> rootList(TaskType taskType,

@ -0,0 +1,24 @@
package org.jeecg.modules.taskType.entity.dto;
import lombok.Data;
/**
* @Author shkstart
* @create 2023-05-13-17:05
*/
@Data
public class TypeDto {
public TypeDto(){
}
public TypeDto(String id, String type_Name) {
this.id = id;
this.type_Name = type_Name;
}
private String id;
private String type_Name;
}
Loading…
Cancel
Save