TaskTable.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. <template>
  2. <HcCard>
  3. <template #header>
  4. <div class="w-36">
  5. <el-select v-model="searchForm.deptId" block clearable placeholder="选择部门" size="large">
  6. <el-option v-for="item in department" :label="item.deptName" :value="item.id"/>
  7. </el-select>
  8. </div>
  9. <div class="w-36 ml-2">
  10. <el-select v-model="searchForm.taskStatus" block clearable placeholder="选择计划状态" size="large">
  11. <el-option label="未完成" value="1"/>
  12. <el-option label="已完成" value="2"/>
  13. <el-option label="逾期完成" value="3"/>
  14. <el-option label="逾期未完成" value="4"/>
  15. </el-select>
  16. </div>
  17. <div class="w-36 ml-4">
  18. <el-date-picker class="block" v-model="searchForm.startTime" type="month" value-format="YYYY-MM" placeholder="开始日期" clearable size="large"/>
  19. </div>
  20. <div class="mx-2">~</div>
  21. <div class="w-36">
  22. <el-date-picker class="block" v-model="searchForm.endTime" type="month" value-format="YYYY-MM" placeholder="结束日期" clearable size="large"/>
  23. </div>
  24. <div class="ml-4">
  25. <el-button size="large" type="primary" @click="searchClick">
  26. <HcIcon name="search-2"/>
  27. <span>搜索</span>
  28. </el-button>
  29. </div>
  30. <div class="ml-2">
  31. <el-button size="large" @click="resetClick">
  32. <HcIcon name="close-circle"/>
  33. <span>重置</span>
  34. </el-button>
  35. </div>
  36. </template>
  37. <template #extra>
  38. <el-button size="large" :type="isTableKey === 1?'primary':'info'" :disabled="isTableKey !== 1" hc-btn @click="showChangeState">
  39. <HcIcon name="edit-circle"/>
  40. <span>变更状态</span>
  41. </el-button>
  42. </template>
  43. <HcTable :column="tableColumn" :isCheck="isTableKey !== 'all'" :datas="tableData" :loading="tableLoading" @selection-change="tableSelectionChange"/>
  44. <template #action>
  45. <HcPages :pages="searchForm" @change="pageChange"/>
  46. </template>
  47. <!--变更状态-->
  48. <HcDialog bgColor="#ffffff" isToBody isTable :loading="changeStateLoading" :show="changeStateModal" title="变更任务状态" widths="62rem"
  49. @close="closeChangeStateClick" @save="saveChangeStateClick">
  50. <div class="hac-change-state-dialog-body">
  51. <div class="hac-dialog-table">
  52. <HcTable :isIndex="false" :column="tableStateColumn" :datas="tableStateData" :loading="tableStateLoading"/>
  53. </div>
  54. <div class="hac-dialog-form">
  55. <HcCardItem scrollbar>
  56. <el-form ref="formRef" :model="formModel" :rules="formRules" label-width="">
  57. <el-form-item label="变更类别:" prop="updateType" size="large">
  58. <el-radio-group v-model="formModel.updateType" size="large">
  59. <el-radio :label="1">已完成</el-radio>
  60. <el-radio :label="2" class="ml-8">任务转移</el-radio>
  61. </el-radio-group>
  62. </el-form-item>
  63. <el-form-item label="完成时间:" prop="completionTime" class="w-72" v-if="formModel.updateType === 1">
  64. <el-date-picker class="block" v-model="formModel.completionTime" format="YYYY-MM-DD HH:mm:ss" type="date" value-format="YYYY-MM-DD HH:mm:ss"/>
  65. </el-form-item>
  66. <template v-if="formModel.updateType === 2">
  67. <el-form-item label="转移时间:" prop="transfer" class="w-72">
  68. <el-date-picker class="block" v-model="formModel.completionTime" format="YYYY-MM-DD HH:mm:ss" type="date" value-format="YYYY-MM-DD HH:mm:ss"/>
  69. </el-form-item>
  70. <el-form-item label="转移对象:" prop="type" size="large">
  71. <el-select class="block" v-model="formModel.transferObject" filterable allow-create default-first-option :reserve-keyword="false">
  72. <el-option v-for="item in userList" :label="item.name" :value="item.id"/>
  73. </el-select>
  74. </el-form-item>
  75. <el-form-item label="转移原因:" prop="textContent">
  76. <el-input v-model="formModel.transferReason" :autosize="{ minRows: 3, maxRows: 5 }" placeholder="请输入文字说明" type="textarea"/>
  77. </el-form-item>
  78. </template>
  79. </el-form>
  80. </HcCardItem>
  81. </div>
  82. </div>
  83. </HcDialog>
  84. </HcCard>
  85. </template>
  86. <script setup>
  87. import {ref, nextTick, watch,onMounted,onActivated} from "vue";
  88. import {useRouter} from 'vue-router'
  89. import {getArrValue,getObjValue,formValidate,arrToId} from "js-fast-way"
  90. import planApi from '~api/task/plan.js';
  91. import { getdepartmentList,getuserList} from "~api/other";
  92. import {useAppStore} from "~src/store";
  93. const useAppState = useAppStore();
  94. const router = useRouter()
  95. onActivated(()=>{
  96. getTableData()
  97. getDepartmentDict()
  98. getUserDict()
  99. })
  100. const department=ref([])
  101. //获取部门列表
  102. const getDepartmentDict=async()=>{
  103. const {error, code, data} = await getdepartmentList({deptType:2})
  104. if (!error && code === 200) {
  105. department.value = getArrValue(data)
  106. } else {
  107. department.value = []
  108. }
  109. }
  110. //获取所有员工
  111. const userList=ref([])
  112. const getUserDict=async()=>{
  113. const {error, code, data} = await getuserList({tenantId:useAppState.tenantId})
  114. if (!error && code === 200) {
  115. userList.value = getArrValue(data)
  116. } else {
  117. userList.value = []
  118. }
  119. }
  120. //参数
  121. const props = defineProps({
  122. tableKey: {
  123. type: Number,
  124. default: 1
  125. }
  126. })
  127. //变量
  128. const isTableKey = ref(props.tableKey);
  129. //监听
  130. watch(() => [
  131. props.tableKey,
  132. ], ([Key]) => {
  133. console.log(Key,'key');
  134. isTableKey.value = Key
  135. searchForm.value.selectType=Key
  136. getTableData()
  137. })
  138. //搜索表单
  139. const searchForm = ref({
  140. deptId: null, selectType:isTableKey.value, planStartTime: null, planEndTime: null,taskStatus:null,
  141. current: 1, size: 20, total: 0
  142. })
  143. //搜索
  144. const searchClick = () => {
  145. searchForm.value.current = 1;
  146. getTableData()
  147. }
  148. //重置
  149. const resetClick = () => {
  150. searchForm.value = {
  151. deptId: null, selectType:isTableKey.value, planStartTime: null, planEndTime: null,taskStatus:null,
  152. current: 1, size: 20, total: 0
  153. }
  154. }
  155. //分页被点击
  156. const pageChange = ({current, size}) => {
  157. searchForm.value.current = current
  158. searchForm.value.size = size
  159. getTableData()
  160. }
  161. //获取数据
  162. const tableLoading = ref(false)
  163. const tableColumn = ref([
  164. {key: 'projectName', name: '任务所属项目'},
  165. {key: 'statusName', name: '状态', width: '120', align: 'center'},
  166. {key: 'taskDesc', name: '任务描述'},
  167. {key: 'planTarget', name: '完成指标'},
  168. {key: 'startAndEndDate', name: '计划起止日期', width: '220', align: 'center'},
  169. {key: 'taskUserName', name: '任务人', width: '120', align: 'center'},
  170. ])
  171. const tableData = ref([])
  172. const getTableData = async() => {
  173. //const key = isTableKey.value
  174. tableLoading.value = true
  175. const {error, code, data} = await planApi.getPage(searchForm.value)
  176. tableLoading.value = false
  177. if (!error && code === 200) {
  178. tableData.value = getArrValue(data['records'])
  179. searchForm.value.total = data['total'] || 0
  180. } else {
  181. tableData.value = []
  182. searchForm.value.total = 0
  183. }
  184. }
  185. //表格选择
  186. const tableRows = ref([])
  187. const tableSelectionChange = (rows) => {
  188. tableRows.value = rows
  189. }
  190. //变更状态的弹窗
  191. const changeStateLoading = ref(false)
  192. const changeStateModal = ref(false)
  193. //显示变更状态的弹窗
  194. const showChangeState = () => {
  195. changeStateLoading.value = false
  196. changeStateModal.value = true
  197. formModel.value={}
  198. tableStateData.value=tableRows.value
  199. }
  200. //变更任务状态表格
  201. const tableStateLoading = ref(false)
  202. const tableStateColumn = [
  203. {key: 'planName', name: '任务名称'},
  204. {key: 'taskDesc', name: '任务描述'},
  205. {key: 'statusName', name: '状态', width: '120', align: 'center'},
  206. ]
  207. const tableStateData = ref([
  208. {id: 1, key1: 'xxxxxxxxx', key2: 'xxxxxxxxx', key3: '未完成'},
  209. {id: 2, key1: 'xxxxxxxxx', key2: 'xxxxxxxxx', key3: '未完成'},
  210. {id: 3, key1: 'xxxxxxxxx', key2: 'xxxxxxxxx', key3: '未完成'},
  211. {id: 4, key1: 'xxxxxxxxx', key2: 'xxxxxxxxx', key3: '未完成'},
  212. {id: 5, key1: 'xxxxxxxxx', key2: 'xxxxxxxxx', key3: '未完成'},
  213. ])
  214. //任务操作数据
  215. const formRef = ref(null)
  216. const formModel = ref({
  217. updateType: '1',
  218. })
  219. const formRules = {
  220. updateType: {
  221. required: true,
  222. trigger: 'blur',
  223. message: "请选择变更类别"
  224. },
  225. }
  226. //关闭变更状态弹窗
  227. const closeChangeStateClick = () => {
  228. changeStateLoading.value = false
  229. changeStateModal.value = false
  230. }
  231. //提交变更状态弹窗
  232. const saveChangeStateClick = async() => {
  233. console.log(formModel.value,'formModel');
  234. const res = await formValidate(formRef.value)
  235. const ids = arrToId(tableRows.value, 'id')
  236. formModel.value.taskIds=ids
  237. if(res){
  238. changeStateLoading.value=true
  239. const {error, code, data,msg} = await planApi.submit( formModel.value)
  240. changeStateLoading.value=false
  241. if (!error && code === 200) {
  242. window.$message.success(msg)
  243. getTableData()
  244. } else{
  245. window.$message.warning(msg)
  246. }
  247. }
  248. changeStateLoading.value = false
  249. changeStateModal.value = false
  250. }
  251. </script>
  252. <style lang="scss" scoped>
  253. .hac-change-state-dialog-body {
  254. position: relative;
  255. height: 100%;
  256. .hac-dialog-table {
  257. position: relative;
  258. height: 40%;
  259. }
  260. .hac-dialog-form {
  261. position: relative;
  262. height: 60%;
  263. padding-top: 20px;
  264. }
  265. }
  266. </style>
  267. <style lang="scss">
  268. .hac-change-state-dialog-body .hac-dialog-form .hc-card-item-box {
  269. background: #f7f7f8;
  270. }
  271. </style>