form.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. <template>
  2. <HcCard actionUi="text-center">
  3. <template #header>
  4. <HcNewSwitch :datas="tabTab" :keys="tabKey" @change="tabChange" :round="false"/>
  5. </template>
  6. <HcTable :isIndex="false" :column="tableColumn" :datas="tableData" :loading="tableLoading">
  7. <template #taskUser="{row}">
  8. <el-select v-model="row.taskUser" size="small">
  9. <el-option v-for="item in department" :label="item.name" :value="item.id"/>
  10. </el-select>
  11. </template>
  12. <template #action="{row,index}" >
  13. <el-button size="small" type="primary" @click="openPlanModalShow(row)" :disabled="row.startOrStop==1||row.startOrStop==0">开启</el-button>
  14. <el-button size="small" type="danger" @click="pausePlanModalShow(row)" :disabled="row.startOrStop==2||row.startOrStop==0">暂停</el-button>
  15. </template>
  16. </HcTable>
  17. <template #action>
  18. <el-button size="large" type="info" hc-btn @click="goBackClick">
  19. <HcIcon name="arrow-go-back"/>
  20. <span>取消并返回</span>
  21. </el-button>
  22. <el-button size="large" type="primary" hc-btn @click="saveClick">
  23. <HcIcon name="check-double"/>
  24. <span>提交保存</span>
  25. </el-button>
  26. </template>
  27. <!--开启计划-->
  28. <HcDialog bgColor="#ffffff" isToBody title="开启计划" widths="40rem" saveText="保存"
  29. :show="openPlanModal" @close="openPlanCloseClick" @save="openPlanSaveClick"
  30. >
  31. <HcListItem title="原计划起止日期:" :content=" openPlan.planStartTime+'~'+openPlan.planEndTime"/>
  32. <HcListItem title="中途暂停计划起止日期:" :content="openPlan.pausePlanStartTime+'~'+openPlan.pausePlanEndTime"/>
  33. <HcListItem title="中途开启计划起止日期:" isCenter>
  34. <HcDatePicker :dates="betweenTime" @change="betweenTimeUpdate"/>
  35. </HcListItem>
  36. <HcListItem title="项目原计划起止工时(天):" isCenter>
  37. <span class="text-red text-xl">{{ openPlan?.planDays }}</span>
  38. </HcListItem>
  39. <HcListItem title="上一次计划工时(天):" isCenter>
  40. <span class="text-red text-xl">{{ openPlan?.lastOpenPlanStartEndDays }}</span>
  41. </HcListItem>
  42. <HcListItem title="上一次计划截止暂停阶段起止工时(天):" isCenter>
  43. <span class="text-red text-xl">6</span>
  44. </HcListItem>
  45. <HcListItem title="中途暂停之后开启计划起止工时(天):" isCenter>
  46. <span class="text-red text-xl">{{ openPlan?.lastOpenPlanStartEndDays }}</span>
  47. </HcListItem>
  48. <div class="mt-8">
  49. <el-alert type="warning" title="提示:" description="该计划暂停之后开启的工时加上暂停前的工时已经超出原计划工时,是否安排不合理,请从新安排!" :closable="false"/>
  50. </div>
  51. </HcDialog>
  52. <!--暂停计划-->
  53. <HcDialog bgColor="#ffffff" isToBody title="暂停计划" widths="40rem" saveText="保存"
  54. :show="pausePlanModal" @close="pausePlanCloseClick" @save="pausePlanSaveClick"
  55. >
  56. <HcListItem title="原计划起止日期:" content="2023-02-23~2023-02-28"/>
  57. <HcListItem title="中途暂停计划日期:" isCenter>
  58. <el-date-picker type="date" class="block" value-format="YYYY-MM-DD"/>
  59. </HcListItem>
  60. <HcListItem title="中途开启计划起止日期:" content="2023-02-23~2023-02-28"/>
  61. <HcListItem title="原计划起止工时(天):" isCenter>
  62. <span class="text-red text-xl">6</span>
  63. </HcListItem>
  64. <HcListItem title="原计划截止暂停阶段起止工时(天):" isCenter>
  65. <span class="text-red text-xl">6</span>
  66. </HcListItem>
  67. <HcListItem title="中途暂停之后开启计划起止工时(天):" isCenter>
  68. <span class="text-red text-xl">6</span>
  69. </HcListItem>
  70. </HcDialog>
  71. </HcCard>
  72. </template>
  73. <script setup>
  74. import {useRouter,useRoute} from 'vue-router'
  75. import {onActivated, ref,watch} from "vue";
  76. import sectionApi from '~api/program/section.js';
  77. import {getArrValue,getObjValue,formValidate, arrIndex} from "js-fast-way"
  78. import { getuserList} from "~api/other";
  79. const router = useRouter()
  80. const useRoutes = useRoute()
  81. const dataId = ref(useRoutes?.query?.id ?? '')
  82. const dataType = ref(useRoutes?.query?.type ?? '')
  83. const planDate=ref(useRoutes?.query?.month ?? '')
  84. const departmentType=ref(useRoutes?.query?.section ?? '')
  85. const deptId=ref(useRoutes?.query?.deptId ?? '')
  86. //缓存页面被激活时
  87. onActivated(() => {
  88. dataId.value = useRoutes?.query?.id ?? ''
  89. dataType.value = useRoutes?.query?.type ?? ''
  90. planDate.value = useRoutes?.query?.month ?? ''
  91. departmentType.value = useRoutes?.query?.section ?? ''
  92. deptId.value = useRoutes?.query?.deptId ?? ''
  93. setTabData(departmentType.value)
  94. getDepartmentPlan()
  95. getDepartmentuserDict()//获取部门人员字典
  96. })
  97. //获取详情
  98. const getDepartmentPlan=async()=>{
  99. const {error, code, data} = await sectionApi.getDepartmentPlan(
  100. {
  101. departmentType:departmentType.value,
  102. deptId:deptId.value,
  103. planDate:planDate.value,
  104. }
  105. )
  106. if (!error && code === 200) {
  107. console.log(getArrValue(data),'详情');
  108. tableData.value=getArrValue(data)
  109. } else {
  110. // milestoneData.value=[]
  111. }
  112. }
  113. const department=ref([])
  114. //获取部门人员列表
  115. const getDepartmentuserDict=async()=>{
  116. const {error, code, data} = await getuserList({deptId:deptId.value})
  117. if (!error && code === 200) {
  118. department.value = getArrValue(data)
  119. } else {
  120. department.value = []
  121. }
  122. }
  123. //类型tab数据和相关处理
  124. const tabKey = ref('1')
  125. const tabTab = ref([
  126. {key: '1', name: '市场部月度预算'},
  127. {key: '2', name: '研发部月度预算'},
  128. {key: '3', name: '实施部月度预算'},
  129. {key: '4', name: '维护部月度预算'},
  130. {key: '5', name: '人事行政(财务)部月度预算'},
  131. ]);
  132. const tabChange = ({key}) => {
  133. tabKey.value = key
  134. }
  135. //设置tab
  136. const setTabData=(key)=>{
  137. tabKey.value=key
  138. if(key=='1'){
  139. tabTab.value=[{key: '1', name: '市场部月度预算'}]
  140. }else if(key=='2'){
  141. console.log(2222222);
  142. tabTab.value=[{key: '2', name: '研发部月度预算'},]
  143. }else if(key=='3'){
  144. tabTab.value=[ {key: '3', name: '实施部月度预算'},]
  145. }else if(key=='4'){
  146. tabTab.value=[ {key: '4', name: '维护部月度预算'},]
  147. }else if(key=='5'){
  148. tabTab.value=[{key: '5', name: '人事行政(财务)部月度预算'},]
  149. }
  150. }
  151. //获取数据
  152. const tableLoading = ref(false)
  153. const tableColumn = [
  154. {key: 'projectName', name: '所属项目', minWidth: '160'},
  155. {key: 'projectProcessValue', name: '项目环节', width: '160', align: 'center'},
  156. {key: 'budgetTypeValue', name: '预算类型', width: '160', align: 'center'},
  157. {key: 'taskDetailValue', name: '任务明细', width: '160', align: 'center'},
  158. {key: 'planTaskType', name: '任务类型', width: '160', align: 'center'},
  159. {key: 'planTaskDesc', name: '任务描述', minWidth: '160', isTooltip: true},
  160. {key: 'planTarget', name: '完成指标', width: '160', align: 'center'},
  161. {key: 'taskUser', name: '任务人', width: '160', align: 'center'},
  162. {key: 'key10', name: '计划起止日期', width: '220', align: 'center'},
  163. {key: 'budgetTravelExpense', name: '预计差旅费(元)', width: '180', align: 'center'},
  164. {key: 'statusValue', name: '状态', width: '100', align: 'center'},
  165. {key: 'action', name: '操作', width: '160', align: 'center', fixed: 'right'},
  166. ]
  167. const tableData = ref([
  168. {id: 1, key1: 'xxx', key2: 'xxx', key3: 'xx', key4: 'xx', key5: 'xx', key6: 'xx', key10: '2022-07-01~2027-04-12'},
  169. {id: 2, key1: 'xxx', key2: 'xxx', key3: 'xx', key4: 'xx', key5: 'xx', key6: 'xx', key10: '2022-07-01~2027-04-12'},
  170. {id: 3, key1: 'xxx', key2: 'xxx', key3: 'xx', key4: 'xx', key5: 'xx', key6: 'xx', key10: '2022-07-01~2027-04-12'},
  171. {id: 4, key1: 'xxx', key2: 'xxx', key3: 'xx', key4: 'xx', key5: 'xx', key6: 'xx', key10: '2022-07-01~2027-04-12'},
  172. ])
  173. const getTableData = () => {
  174. }
  175. //开启计划
  176. const openPlanModal = ref(false)
  177. const openPlanModalShow = (row) => {
  178. getPlanInOpen(row.id)
  179. openPlanModal.value = true
  180. }
  181. //获取开启计划
  182. const openPlan=ref({})
  183. const getPlanInOpen=async(id)=>{
  184. const {error, code, data} = await sectionApi.getPlanInOpen({id})
  185. if (!error && code === 200) {
  186. openPlan.value = getObjValue(data)
  187. betweenTime.value=[openPlan.value.openPlanStartTime,openPlan.value.openPlanEndTime]
  188. } else {
  189. openPlan.value = {}
  190. }
  191. }
  192. const openPlanCloseClick = () => {
  193. openPlanModal.value = false
  194. }
  195. const openPlanSaveClick = () => {
  196. }
  197. //日期时间被选择
  198. const betweenTime = ref(null)
  199. const betweenTimeUpdate = ({arr, query}) => {
  200. betweenTime.value = arr
  201. }
  202. //暂停计划
  203. const pausePlanModal = ref(false)
  204. const pausePlanModalShow = (row) => {
  205. getPlanInPause(row.id)
  206. pausePlanModal.value = true
  207. }
  208. //获取暂停计划
  209. const pausePlan=ref({})
  210. const getPlanInPause=async(id)=>{
  211. const {error, code, data} = await sectionApi.getPlanInPause({id})
  212. if (!error && code === 200) {
  213. pausePlan.value = getObjValue(data)
  214. } else {
  215. pausePlan.value = {}
  216. }
  217. }
  218. const pausePlanCloseClick = () => {
  219. pausePlanModal.value = false
  220. }
  221. const pausePlanSaveClick = () => {
  222. }
  223. //返回
  224. const goBackClick = () => {
  225. router.back()
  226. }
  227. const saveLoaing=ref(false)
  228. //提交保存
  229. const saveClick = async() => {
  230. console.log(tableData.value,'tableData');
  231. saveLoaing.value=true
  232. const {error, code, data,msg} = await sectionApi.updateDepartmentPlan( {departmentPlanList:tableData.value})
  233. saveLoaing.value=false
  234. if (!error && code === 200) {
  235. window.$message.success(msg)
  236. }
  237. }
  238. </script>