edit.vue 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. <template>
  2. <ion-page>
  3. <ion-header class="header-theme2">
  4. <ion-toolbar>
  5. <ion-buttons slot="start">
  6. <ion-icon :icon="arrowBackOutline" @click="onCancel"></ion-icon>
  7. </ion-buttons>
  8. <ion-title>工作任务完成情况</ion-title>
  9. </ion-toolbar>
  10. </ion-header>
  11. <ion-content>
  12. <div class="bw-vue-form">
  13. <div class="form-title">工作任务详细信息</div>
  14. <div class="form-detail">
  15. <ion-label>任务名称</ion-label>
  16. <ion-text>{{ dataModel.doTaskName }}</ion-text>
  17. </div>
  18. <div class="form-detail">
  19. <ion-label>要求完成时间</ion-label>
  20. <ion-text>{{ dataModel.finishTime ? dayjs(dataModel.finishTime).format("YYYY-MM-DD") : '' }}</ion-text>
  21. </div>
  22. <div class="form-detail">
  23. <ion-label>任务类型</ion-label>
  24. <ion-text>{{ dataModel.workTypeName }}</ion-text>
  25. </div>
  26. <div class="form-detail">
  27. <ion-label>任务内容</ion-label>
  28. <ion-text>{{ dataModel.content }}</ion-text>
  29. </div>
  30. </div>
  31. <!-- 任务完成情况选择 -->
  32. <div class="bw-vue-form">
  33. <div class="form-select">
  34. <ion-label>
  35. 任务完成情况
  36. </ion-label>
  37. <ion-select name="doTypeID" id="doTypeID" interface="action-sheet" okText="确定" cancelText="取消"
  38. v-model="dataModel.taskStatus" placeholder="请选择任务完成情况">
  39. <ion-select-option v-for="(it,key) in taskStatusCodeList" :key="key" :value="it.value">
  40. {{ it.name }}
  41. </ion-select-option>
  42. </ion-select>
  43. </div>
  44. <div class="form-input">
  45. <ion-label>
  46. 任务完成日期
  47. </ion-label>
  48. <div class="dateTimeBox">
  49. <ion-datetime-button datetime="completeTime"></ion-datetime-button>
  50. <ion-modal :keep-contents-mounted="true">
  51. <ion-datetime id="completeTime" placeholder="日期"
  52. v-model="dataModel.completeTime" :prefer-wheel="true"
  53. dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
  54. :show-default-buttons="true">
  55. </ion-datetime>
  56. </ion-modal>
  57. </div>
  58. </div>
  59. </div>
  60. </ion-content>
  61. <ion-footer>
  62. <ion-button shape="round" expand="block" @click="onSave">提交</ion-button>
  63. </ion-footer>
  64. <ion-loading
  65. :is-open="bodyLoading"
  66. message="加载中..."
  67. @didDismiss="setBodyLoadingOpen(false)">
  68. </ion-loading>
  69. </ion-page>
  70. </template>
  71. <script lang="ts">
  72. import {computed, defineComponent, onMounted, reactive, ref, toRefs} from "vue";
  73. import {getSysDictionaryList} from '@/api/system/dictionary';
  74. import {getMyWorkTasks, getWorkUserList, saveWorkTask, taskFinish} from '@/api/workTask';
  75. import {useRoute, useRouter} from "vue-router";
  76. import {alertController, onIonViewDidEnter} from "@ionic/vue";
  77. import {arrowBackOutline} from 'ionicons/icons';
  78. import dayjs from "dayjs";
  79. import {useVuelidate} from "@vuelidate/core";
  80. import {required} from "@vuelidate/validators";
  81. interface SiteUserModel{
  82. siteUserID:string,
  83. siteUserName:string
  84. }
  85. interface workTaskModel {
  86. dataModel: {
  87. doTaskID:any,
  88. doTaskName: string,
  89. workTypeID: any,
  90. content:string,
  91. finishTime:any,
  92. workTypeName: string,
  93. taskStatus: any,
  94. taskStatusName: string,
  95. completeTime: any
  96. }
  97. }
  98. interface SelectProps {
  99. name: string,
  100. value: string
  101. }
  102. export default defineComponent({
  103. name: 'WorkTaskEdit',
  104. setup() {
  105. const router = useRouter();
  106. const route = useRoute();
  107. const editForm = ref();
  108. const taskTypeList=ref<SelectProps[]>([]);
  109. const curTaskUserList = ref<SiteUserModel[]>([]);
  110. const curTaskUserStr = ref("");
  111. const searchParamsState = reactive({
  112. pageIndex: 1,
  113. pageSize: 10,
  114. total:0,
  115. doTaskID:'',
  116. taskName: ''
  117. });
  118. const workTaskData = reactive<workTaskModel>({
  119. dataModel:{
  120. doTaskID:null,
  121. doTaskName: '',
  122. workTypeID: null,
  123. content:'',
  124. finishTime:null,
  125. workTypeName: '',
  126. taskStatus: null,
  127. taskStatusName: '',
  128. completeTime: null
  129. }});
  130. // 任务完成状态字典
  131. const taskStatusCodeList = ref<Array<any>>([]);
  132. // 页面加载动画开关
  133. const bodyLoading = ref(false);
  134. const workTaskRules = computed(() => {
  135. return {dataModel:{
  136. doTaskName:{required},
  137. workTypeID:{required},
  138. content:{required},
  139. finishTime:{required},
  140. }}});
  141. const workTaskValid = useVuelidate(workTaskRules, workTaskData);
  142. const presentAlert = async (header: string, message: string) => {
  143. const alert = await alertController.create({
  144. header: header,
  145. message: message,
  146. buttons: [
  147. '确定'
  148. ],
  149. });
  150. await alert.present();
  151. }
  152. const selectTaskUser = (item:any)=>{
  153. item.checked = !item.checked;
  154. console.log("itemData",item);
  155. }
  156. function onSave() {
  157. taskFinish(workTaskData.dataModel.doTaskID, workTaskData.dataModel.completeTime).then(result => {
  158. if (result) {
  159. router.go(-1);
  160. }
  161. })
  162. }
  163. const onCancel = () => {
  164. router.go(-1);
  165. }
  166. const getWorkTypeList = async function(){
  167. const data:any = await getSysDictionaryList("TaskType");
  168. taskTypeList.value = data;
  169. console.log("taskTypeList",taskTypeList.value);
  170. }
  171. const loadCurTaskUserList = async (taskID: any) => {
  172. const data:any = await getWorkUserList(taskID);
  173. curTaskUserList.value = data;
  174. console.log("curTaskUserList",curTaskUserList.value);
  175. if(curTaskUserList.value.length>0){
  176. curTaskUserList.value.map(x=>{
  177. curTaskUserStr.value += x.siteUserName + " ";
  178. })
  179. }
  180. console.log("curTaskUserStr",curTaskUserStr.value);
  181. }
  182. const loadData = async (doTaskID: any) => {
  183. bodyLoading.value = true;
  184. curTaskUserStr.value ="";
  185. await getWorkTypeList();
  186. await loadCurTaskUserList(doTaskID);
  187. searchParamsState.doTaskID = doTaskID;
  188. const reqData = await getMyWorkTasks(searchParamsState);
  189. workTaskData.dataModel = reqData.list[0];
  190. console.log("初始化dataModel",workTaskData.dataModel);
  191. bodyLoading.value = false;
  192. };
  193. const reload = (doTaskID: any) => {
  194. curTaskUserList.value = [];
  195. loadData(doTaskID);
  196. }
  197. // 设置加载动画状态
  198. function setBodyLoadingOpen(value: boolean) {
  199. bodyLoading.value = value;
  200. }
  201. onIonViewDidEnter(() => {
  202. if (route.query.reload)
  203. reload(route.query.doTaskID);
  204. });
  205. onMounted(() => {
  206. // 获取任务完成状态字典数据
  207. getSysDictionaryList("TaskStatusType").then((result: any) => {
  208. taskStatusCodeList.value = result;
  209. })
  210. })
  211. return {
  212. ...toRefs(workTaskData),
  213. arrowBackOutline,
  214. route,
  215. router,
  216. editForm,
  217. taskTypeList,
  218. curTaskUserList,
  219. curTaskUserStr,
  220. selectTaskUser,
  221. loadData,
  222. onSave,
  223. onCancel,
  224. dayjs,
  225. workTaskValid,
  226. taskStatusCodeList,
  227. bodyLoading,
  228. setBodyLoadingOpen
  229. }
  230. }
  231. });
  232. </script>
  233. <style lang="less">
  234. .custom{
  235. --placeholder-color: gray;
  236. --placeholder-opacity: 0.5;
  237. }
  238. .title-item{
  239. margin-left: 15px;
  240. color:#3a7be0;
  241. font-size: 16px;
  242. }
  243. .dateTimeBox {
  244. width: 100%;
  245. display: flex;
  246. margin-top: 5px;
  247. justify-content: space-between;
  248. align-content: center;
  249. }
  250. </style>