TaskTable.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. <template>
  2. <HcCard>
  3. <template #header>
  4. <div class="w-36">
  5. <el-select v-model="searchForm.department" block clearable placeholder="选择部门" size="large">
  6. <el-option label="研发部门" value="1"/>
  7. <el-option label="业务部门" value="2"/>
  8. <el-option label="人事部门" value="3"/>
  9. </el-select>
  10. </div>
  11. <div class="w-36 ml-2">
  12. <el-select v-model="searchForm.state" block clearable placeholder="选择计划状态" size="large">
  13. <el-option label="未完成" value="1"/>
  14. <el-option label="已完成" value="2"/>
  15. <el-option label="逾期完成" value="3"/>
  16. <el-option label="逾期未完成" value="4"/>
  17. </el-select>
  18. </div>
  19. <div class="w-36 ml-4">
  20. <el-date-picker class="block" v-model="searchForm.startTime" type="month" value-format="YYYY-MM" placeholder="开始日期" clearable size="large"/>
  21. </div>
  22. <div class="mx-2">~</div>
  23. <div class="w-36">
  24. <el-date-picker class="block" v-model="searchForm.endTime" type="month" value-format="YYYY-MM" placeholder="结束日期" clearable size="large"/>
  25. </div>
  26. <div class="ml-4">
  27. <el-button size="large" type="primary" @click="searchClick">
  28. <HcIcon name="search-2"/>
  29. <span>搜索</span>
  30. </el-button>
  31. </div>
  32. <div class="ml-2">
  33. <el-button size="large" @click="resetClick">
  34. <HcIcon name="close-circle"/>
  35. <span>重置</span>
  36. </el-button>
  37. </div>
  38. </template>
  39. <template #extra>
  40. <el-button size="large" type="danger" hc-btn v-if="isTableKey === 'links'">
  41. <HcIcon name="close-circle"/>
  42. <span>取消关联</span>
  43. </el-button>
  44. <el-button size="large" type="success" hc-btn @click="relevanceClick">
  45. <HcIcon name="link" :line="false"/>
  46. <span>关联任务</span>
  47. </el-button>
  48. <el-button size="large" :type="isTableKey === 'user'?'primary':'info'" :disabled="isTableKey !== 'user'" hc-btn @click="showChangeState">
  49. <HcIcon name="edit-circle"/>
  50. <span>变更状态</span>
  51. </el-button>
  52. </template>
  53. <HcTable :column="tableColumn" :isCheck="isTableKey !== 'all'" :datas="tableData" :loading="tableLoading" @selection-change="tableSelectionChange"/>
  54. <template #action>
  55. <HcPages :pages="searchForm" @change="pageChange"/>
  56. </template>
  57. <!--关联任务-->
  58. <HcDialog bgColor="#ffffff" isToBody isTable isRowFooter :loading="relatedLoading" :show="relatedModal" title="关联任务" widths="62rem" @close="closeRelatedClick">
  59. <div class="hac-diy-dialog-body">
  60. <div class="hac-dialog-header">
  61. <div class="w-36">
  62. <el-select v-model="searchBudgetForm.department" block clearable placeholder="选择部门" size="large">
  63. <el-option label="研发部门" value="1"/>
  64. <el-option label="业务部门" value="2"/>
  65. <el-option label="人事部门" value="3"/>
  66. </el-select>
  67. </div>
  68. <div class="w-36 ml-2">
  69. <el-select v-model="searchBudgetForm.state" block clearable placeholder="选择计划状态" size="large">
  70. <el-option label="未完成" value="1"/>
  71. <el-option label="已完成" value="2"/>
  72. <el-option label="逾期完成" value="3"/>
  73. <el-option label="逾期未完成" value="4"/>
  74. </el-select>
  75. </div>
  76. <div class="w-36 ml-2">
  77. <el-select v-model="searchBudgetForm.user" block clearable placeholder="选择任务人" size="large">
  78. <el-option label="张三" value="1"/>
  79. <el-option label="李四" value="2"/>
  80. </el-select>
  81. </div>
  82. <div class="ml-4">
  83. <el-button size="large" type="primary">
  84. <HcIcon name="search-2"/>
  85. <span>搜索</span>
  86. </el-button>
  87. </div>
  88. <div class="ml-2">
  89. <el-button size="large">
  90. <HcIcon name="close-circle"/>
  91. <span>重置</span>
  92. </el-button>
  93. </div>
  94. </div>
  95. <div class="hac-dialog-table">
  96. <HcTable :column="tableBudgetColumn" :datas="tableBudgetData" :loading="tableBudgetLoading">
  97. <template #action="{row,index}">
  98. <el-button plain size="small" type="primary" @click="row.isRelated = true" v-if="!row.isRelated">
  99. <HcIcon name="link" :line="false"/>
  100. <span>关联</span>
  101. </el-button>
  102. <el-button plain size="small" type="danger" @click="row.isRelated = false" v-else>
  103. <HcIcon name="link-unlink-m" :line="false"/>
  104. <span>取消</span>
  105. </el-button>
  106. </template>
  107. </HcTable>
  108. </div>
  109. </div>
  110. <template #leftRowFooter>
  111. <el-button size="large" @click="closeRelatedClick">
  112. <HcIcon name="close"/>
  113. <span>取消</span>
  114. </el-button>
  115. <el-button size="large" type="primary" @click="saveRelatedClick">
  116. <HcIcon name="check"/>
  117. <span>确认关联</span>
  118. </el-button>
  119. </template>
  120. <template #rightRowFooter>
  121. <HcPages :pages="searchBudgetForm" @change="pageBudgetChange"/>
  122. </template>
  123. </HcDialog>
  124. <!--变更状态-->
  125. <HcDialog bgColor="#ffffff" isToBody isTable :loading="changeStateLoading" :show="changeStateModal" title="变更任务状态" widths="62rem"
  126. @close="closeChangeStateClick" @save="saveChangeStateClick">
  127. <div class="hac-change-state-dialog-body">
  128. <div class="hac-dialog-table">
  129. <HcTable :isIndex="false" :column="tableStateColumn" :datas="tableStateData" :loading="tableStateLoading"/>
  130. </div>
  131. <div class="hac-dialog-form">
  132. <HcCardItem scrollbar>
  133. <el-form ref="formRef" :model="formModel" :rules="formRules" label-width="">
  134. <el-form-item label="变更类别:" prop="type" size="large">
  135. <el-radio-group v-model="formModel.type" size="large">
  136. <el-radio label="1">已完成</el-radio>
  137. <el-radio label="2">延期执行</el-radio>
  138. <el-radio label="3">任务转移</el-radio>
  139. </el-radio-group>
  140. </el-form-item>
  141. <el-form-item label="完成时间:" prop="finish_time" class="w-72" v-if="formModel.type === '1'">
  142. <el-date-picker class="block" v-model="formModel.finish_time" format="YYYY-MM-DD" type="date" value-format="YYYY-MM-DD"/>
  143. </el-form-item>
  144. <el-form-item label="延期时间:" prop="delay_time" class="w-72" v-if="formModel.type === '2'">
  145. <el-date-picker class="block" v-model="formModel.delay_time" format="YYYY-MM-DD" type="date" value-format="YYYY-MM-DD"/>
  146. </el-form-item>
  147. <el-form-item label="延期原因:" prop="delay_cause" v-if="formModel.type === '2'">
  148. <el-input v-model="formModel.delay_cause" :autosize="{ minRows: 3, maxRows: 5 }" placeholder="请输入文字说明" type="textarea"/>
  149. </el-form-item>
  150. <div class="flex" v-if="formModel.type === '3'">
  151. <el-form-item label="转移时间:" prop="transfer" class="w-64 mr-4">
  152. <el-date-picker class="block" v-model="formModel.transfer" format="YYYY-MM-DD" type="date" value-format="YYYY-MM-DD"/>
  153. </el-form-item>
  154. <el-form-item label="转移后剩余工作任务完成日期:" prop="complete" class="w-96 ml-4">
  155. <el-date-picker class="block" v-model="formModel.complete" format="YYYY-MM-DD" type="date" value-format="YYYY-MM-DD"/>
  156. </el-form-item>
  157. </div>
  158. <el-form-item label="转移对象:" prop="type" size="large" v-if="formModel.type === '3'">
  159. <el-select class="block" v-model="formModel.user" multiple filterable allow-create default-first-option :reserve-keyword="false">
  160. <el-option label="张三" value="1"/>
  161. <el-option label="李四" value="2"/>
  162. <el-option label="王五" value="3"/>
  163. <el-option label="王麻子" value="4"/>
  164. </el-select>
  165. </el-form-item>
  166. <el-form-item label="转移原因:" prop="textContent" v-if="formModel.type === '3'">
  167. <el-input v-model="formModel.textContent" :autosize="{ minRows: 3, maxRows: 5 }" placeholder="请输入文字说明" type="textarea"/>
  168. </el-form-item>
  169. </el-form>
  170. </HcCardItem>
  171. </div>
  172. </div>
  173. </HcDialog>
  174. </HcCard>
  175. </template>
  176. <script setup>
  177. import {ref, nextTick, watch} from "vue";
  178. import {useRouter} from 'vue-router'
  179. import {getArrValue} from "js-fast-way"
  180. const router = useRouter()
  181. //参数
  182. const props = defineProps({
  183. tableKey: {
  184. type: String,
  185. default: ''
  186. }
  187. })
  188. //变量
  189. const isTableKey = ref(props.tableKey);
  190. //监听
  191. watch(() => [
  192. props.tableKey,
  193. ], ([Key]) => {
  194. isTableKey.value = Key
  195. })
  196. //搜索表单
  197. const searchForm = ref({
  198. department: null, state: null, startTime: null, endTime: null,
  199. current: 1, size: 20, total: 0
  200. })
  201. //搜索
  202. const searchClick = () => {
  203. searchForm.value.current = 1;
  204. console.log(searchForm.value)
  205. getTableData()
  206. }
  207. //重置
  208. const resetClick = () => {
  209. searchForm.value = {
  210. department: null, state: null, startTime: null, endTime: null,
  211. current: 1, size: 20, total: 0
  212. }
  213. }
  214. //分页被点击
  215. const pageChange = ({current, size}) => {
  216. searchForm.value.current = current
  217. searchForm.value.size = size
  218. getTableData()
  219. }
  220. //获取数据
  221. const tableLoading = ref(false)
  222. const tableColumn = ref([
  223. {key: 'name', name: '计划名称'},
  224. {key: 'key', name: '状态', width: '120', align: 'center'},
  225. {key: 'key1', name: '任务描述'},
  226. {key: 'key2', name: '完成指标'},
  227. {key: 'key3', name: '完成期限', width: '160', align: 'center'},
  228. {key: 'key4', name: '任务人', width: '120', align: 'center'},
  229. ])
  230. const tableData = ref([
  231. {id: 1, name: '【任务描述】申请【任务转移】', key: '未完成', key1: 'xxxxxxxxxx', key2: 'xxxxxxxx', key3: '2022-02-01', key4: '张三'},
  232. {id: 2, name: '【任务描述】申请【任务转移】', key: '未完成', key1: 'xxxxxxxxxx', key2: 'xxxxxxxx', key3: '2022-02-01', key4: '张三'},
  233. {id: 3, name: '【任务描述】申请【任务转移】', key: '未完成', key1: 'xxxxxxxxxx', key2: 'xxxxxxxx', key3: '2022-02-01', key4: '张三'},
  234. ])
  235. const getTableData = () => {
  236. //const key = isTableKey.value
  237. }
  238. //表格选择
  239. const tableRows = ref([])
  240. const tableSelectionChange = (rows) => {
  241. tableRows.value = rows
  242. }
  243. //关联任务弹窗
  244. const relatedLoading = ref(false)
  245. const relatedModal = ref(false)
  246. //关联任务
  247. const relevanceClick = () => {
  248. relatedLoading.value = false
  249. relatedModal.value = true
  250. }
  251. //关联任务分页和搜索
  252. const searchBudgetForm = ref({current: 1, size: 20, total: 0})
  253. const pageBudgetChange = ({current, size}) => {
  254. searchBudgetForm.value.current = current
  255. searchBudgetForm.value.size = size
  256. }
  257. //关联任务表格
  258. const tableBudgetLoading = ref(false)
  259. const tableBudgetColumn = [
  260. {key: 'key', name: '任务描述'},
  261. {key: 'key1', name: '任务人', width: '120', align: 'center'},
  262. {key: 'key2', name: '任务起止日期', width: '220', align: 'center'},
  263. {key: 'key3', name: '状态', width: '120', align: 'center'},
  264. {key: 'action', name: '操作', width: '90', align: 'center'},
  265. ]
  266. const tableBudgetData = ref([
  267. {id: 1, key: 'xxxxxxxxx', key1: '张三', key2: '2022-07-01~2027-04-12', key3: '未完成'},
  268. {id: 2, key: 'xxxxxxxxx', key1: '张三', key2: '2022-07-01~2027-04-12', key3: '未完成'},
  269. {id: 3, key: 'xxxxxxxxx', key1: '张三', key2: '2022-07-01~2027-04-12', key3: '未完成'},
  270. {id: 4, key: 'xxxxxxxxx', key1: '张三', key2: '2022-07-01~2027-04-12', key3: '未完成'},
  271. ])
  272. //关闭关联任务弹窗
  273. const closeRelatedClick = () => {
  274. relatedLoading.value = false
  275. relatedModal.value = false
  276. }
  277. //提交关联任务弹窗
  278. const saveRelatedClick = () => {
  279. relatedLoading.value = false
  280. relatedModal.value = false
  281. }
  282. //变更状态的弹窗
  283. const changeStateLoading = ref(false)
  284. const changeStateModal = ref(false)
  285. //显示变更状态的弹窗
  286. const showChangeState = () => {
  287. changeStateLoading.value = false
  288. changeStateModal.value = true
  289. }
  290. //变更任务状态表格
  291. const tableStateLoading = ref(false)
  292. const tableStateColumn = [
  293. {key: 'key1', name: '任务名称'},
  294. {key: 'key2', name: '任务描述'},
  295. {key: 'key3', name: '状态', width: '120', align: 'center'},
  296. ]
  297. const tableStateData = ref([
  298. {id: 1, key1: 'xxxxxxxxx', key2: 'xxxxxxxxx', key3: '未完成'},
  299. {id: 2, key1: 'xxxxxxxxx', key2: 'xxxxxxxxx', key3: '未完成'},
  300. {id: 3, key1: 'xxxxxxxxx', key2: 'xxxxxxxxx', key3: '未完成'},
  301. {id: 4, key1: 'xxxxxxxxx', key2: 'xxxxxxxxx', key3: '未完成'},
  302. {id: 5, key1: 'xxxxxxxxx', key2: 'xxxxxxxxx', key3: '未完成'},
  303. ])
  304. //任务操作数据
  305. const formRef = ref(null)
  306. const formModel = ref({
  307. type: '1',
  308. })
  309. const formRules = {
  310. title: {
  311. required: true,
  312. trigger: 'blur',
  313. message: "请输入节点名称"
  314. },
  315. }
  316. //关闭变更状态弹窗
  317. const closeChangeStateClick = () => {
  318. changeStateLoading.value = false
  319. changeStateModal.value = false
  320. }
  321. //提交变更状态弹窗
  322. const saveChangeStateClick = () => {
  323. changeStateLoading.value = false
  324. changeStateModal.value = false
  325. }
  326. </script>
  327. <style lang="scss" scoped>
  328. .hac-change-state-dialog-body {
  329. position: relative;
  330. height: 100%;
  331. .hac-dialog-table {
  332. position: relative;
  333. height: 40%;
  334. }
  335. .hac-dialog-form {
  336. position: relative;
  337. height: 60%;
  338. padding-top: 20px;
  339. }
  340. }
  341. </style>
  342. <style lang="scss">
  343. .hac-change-state-dialog-body .hac-dialog-form .hc-card-item-box {
  344. background: #f7f7f8;
  345. }
  346. </style>