Order-publish.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. <template>
  2. <el-dialog v-model="state.dialogVisible" draggable :title="dialogTitle" ref="dialogRef" width="50%" append-to-body destroy-on-close @close="close">
  3. <div class="collapse-container">
  4. <el-form label-width="100px" ref="ruleFormRef" :model="state.ruleForm">
  5. <el-row :gutter="10" class="w100">
  6. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.orderDetail.isProvince">
  7. <el-row :gutter="0">
  8. <el-divider content-position="left">
  9. <el-text tag="b" size="large"> 省工单发布内容 </el-text>
  10. </el-divider>
  11. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  12. <el-form-item label="是否公开" prop="proPublishState" :rules="[{ required: false, message: '请选择是否公开', trigger: 'change' }]">
  13. <el-radio-group v-model="state.ruleForm.proPublishState" :disabled="disabled">
  14. <el-radio :label="false">不公开</el-radio>
  15. <el-radio :label="true">公开</el-radio>
  16. </el-radio-group>
  17. </el-form-item>
  18. </el-col>
  19. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  20. <el-form-item
  21. label="反馈人电话"
  22. prop="feedBackPhone"
  23. :rules="[
  24. { required: false, message: '请输入反馈人电话', trigger: 'blur' },
  25. {
  26. pattern: /^((0\d{2,3}(-)?\d{7,8})|(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8})$/,
  27. message: '反馈人电话格式错误',
  28. trigger: 'blur',
  29. },
  30. ]"
  31. >
  32. <el-input placeholder="请输入反馈人电话" v-model="state.ruleForm.feedBackPhone" clearable :disabled="disabled"></el-input>
  33. </el-form-item>
  34. </el-col>
  35. <el-col :xs="24" :sm="12" :md="24" :lg="24" :xl="24" v-if="!state.ruleForm.proPublishState">
  36. <el-form-item label="不公开原因" prop="noPubReason" :rules="[{ required: false, message: '请输入不公开原因', trigger: 'blur' }]">
  37. <el-input
  38. type="textarea"
  39. placeholder="请输入不公开原因"
  40. :autosize="{ minRows: 6, maxRows: 10 }"
  41. v-model="state.ruleForm.noPubReason"
  42. :disabled="disabled"
  43. ></el-input>
  44. </el-form-item>
  45. </el-col>
  46. <template v-if="isZGZFW">
  47. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  48. <el-form-item label="是否联系" prop="isContact" :rules="[{ required: true, message: '请选择是否公开', trigger: 'change' }]">
  49. <el-radio-group v-model="state.ruleForm.isContact" :disabled="disabled">
  50. <el-radio :label="true">是</el-radio>
  51. <el-radio :label="false">否</el-radio>
  52. </el-radio-group>
  53. </el-form-item>
  54. </el-col>
  55. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  56. <el-form-item label="是否评价" prop="isVisited" :rules="[{ required: true, message: '请选择是否公开', trigger: 'change' }]">
  57. <el-radio-group v-model="state.ruleForm.isVisited" :disabled="disabled">
  58. <el-radio :label="true">是</el-radio>
  59. <el-radio :label="false">否</el-radio>
  60. </el-radio-group>
  61. </el-form-item>
  62. </el-col>
  63. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  64. <el-form-item label="网民评价" prop="netizen" :rules="[{ required: false, message: '请选择网民评价', trigger: 'change' }]">
  65. <el-radio-group v-model="state.ruleForm.netizen" :disabled="disabled">
  66. <el-radio :label="item.key" v-for="item in netizenEvaluateType" :key="item.key">{{ item.value }}</el-radio>
  67. </el-radio-group>
  68. </el-form-item>
  69. </el-col>
  70. <el-col :xs="24" :sm="12" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.isVisited">
  71. <el-form-item label="评价内容" prop="evaluateContent" :rules="[{ required: false, message: '请输入评价内容', trigger: 'blur' }]">
  72. <el-input
  73. type="textarea"
  74. placeholder="请输入评价内容"
  75. :autosize="{ minRows: 6, maxRows: 10 }"
  76. v-model="state.ruleForm.evaluateContent"
  77. :disabled="disabled"
  78. ></el-input>
  79. </el-form-item>
  80. </el-col>
  81. <el-col :xs="24" :sm="12" :md="24" :lg="24" :xl="24">
  82. <el-form-item label="备注" prop="remark" :rules="[{ required: false, message: '请输入备注', trigger: 'blur' }]">
  83. <el-input
  84. type="textarea"
  85. placeholder="请输入备注"
  86. :autosize="{ minRows: 6, maxRows: 10 }"
  87. v-model="state.ruleForm.remark"
  88. :disabled="disabled"
  89. ></el-input>
  90. </el-form-item>
  91. </el-col>
  92. </template>
  93. </el-row>
  94. </el-col>
  95. <el-divider content-position="left">
  96. <el-text tag="b" size="large"> 市工单发布内容 </el-text>
  97. </el-divider>
  98. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  99. <el-form-item label="工单标题"> {{ state.publishDetail.orderTitle }} </el-form-item>
  100. </el-col>
  101. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  102. <el-form-item label="整改后标题" prop="arrangeTitle" :rules="[{ required: false, message: '请输入整改后标题', trigger: 'blur' }]">
  103. <el-input placeholder="请输入整改后标题" v-model="state.ruleForm.arrangeTitle" clearable :disabled="disabled"></el-input>
  104. </el-form-item>
  105. </el-col>
  106. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  107. <el-form-item label="工单内容"> {{ state.publishDetail.content }} </el-form-item>
  108. </el-col>
  109. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  110. <el-form-item label="整改后内容" prop="arrangeContent" :rules="[{ required: false, message: '请输入整改后内容', trigger: 'blur' }]">
  111. <el-input
  112. placeholder="请输入整改后内容"
  113. type="textarea"
  114. :autosize="{ minRows: 6, maxRows: 10 }"
  115. v-model="state.ruleForm.arrangeContent"
  116. :disabled="disabled"
  117. ></el-input>
  118. </el-form-item>
  119. </el-col>
  120. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  121. <el-form-item label="办理结果"> {{ state.publishDetail.actualOpinion }}</el-form-item>
  122. </el-col>
  123. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  124. <el-form-item label="整改后结果" prop="arrangeOpinion" :rules="[{ required: false, message: '请输入整改后内容', trigger: 'blur' }]">
  125. <el-input
  126. type="textarea"
  127. placeholder="请输入整改后办件结果"
  128. :autosize="{ minRows: 6, maxRows: 10 }"
  129. v-model="state.ruleForm.arrangeOpinion"
  130. :disabled="disabled"
  131. ></el-input>
  132. </el-form-item>
  133. </el-col>
  134. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  135. <el-form-item label="门户是否公开" prop="publishState" :rules="[{ required: false, message: '请输入整改后内容', trigger: 'blur' }]">
  136. <el-radio-group v-model="state.ruleForm.publishState" :disabled="disabled">
  137. <el-radio :label="false">不公开</el-radio>
  138. <el-radio :label="true">公开</el-radio>
  139. </el-radio-group>
  140. </el-form-item>
  141. </el-col>
  142. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  143. <el-form-item label="实际办理部门">
  144. {{ state.publishDetail.actualHandleOrgName?.value }}
  145. </el-form-item>
  146. </el-col>
  147. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="idNamesArray.length">
  148. <el-form-item label="需回访部门" prop="idNames" :rules="[{ required: false, message: '请选择需回访部门', trigger: 'blur' }]">
  149. <el-checkbox-group v-model="state.ruleForm.idNames" :disabled="disabled">
  150. <el-checkbox :label="item" v-for="item in idNamesArray" :key="item.key">{{ item.value }}</el-checkbox>
  151. </el-checkbox-group>
  152. </el-form-item>
  153. </el-col>
  154. </el-row>
  155. </el-form>
  156. </div>
  157. <template #footer v-if="!disabled">
  158. <span class="dialog-footer">
  159. <el-button @click="closeDialog" class="default-button">取 消</el-button>
  160. <el-button type="primary" @click="onPublish(ruleFormRef)" v-if="!disabled" :loading="state.loading">发布</el-button>
  161. </span>
  162. </template>
  163. </el-dialog>
  164. </template>
  165. <script setup lang="ts" name="orderPublishDetail">
  166. import { computed, reactive, ref } from 'vue';
  167. import { ElMessage, FormInstance } from 'element-plus';
  168. import { baseData, publishOrderDetail } from '@/api/business/publish';
  169. import { publishOrder } from '@/api/todo/publish';
  170. // 定义子组件向父组件传值/事件
  171. const emit = defineEmits(['updateList']);
  172. // 定义变量内容
  173. const state = reactive<any>({
  174. dialogVisible: false, // 是否显示弹窗
  175. loading: false, // 是否显示加载
  176. ruleForm: {
  177. proPublishState: false, // 是否公开
  178. isContact: true, // 是否联系
  179. isVisited: true, // 是否评价
  180. feedBackPhone: '', // 反馈人电话
  181. noPubReason: '', // 不公开原因
  182. arrangeContent: '', // 整改后内容
  183. arrangeOpinion: '', // 整改后结果
  184. idNames: [], // 需回访部门
  185. publishState: false, // 门户是否公开
  186. },
  187. orderDetail: {}, // 工单详情
  188. publishDetail: {}, // 发布详情
  189. });
  190. const ruleFormRef = ref<RefType>(); // 表单ref
  191. const idNamesArray = ref<EmptyArrayType>(); // 部门列表
  192. const disabled = ref<boolean>(false); //是否查看详情
  193. const dialogTitle = ref<string>('发布详情'); // 弹窗标题
  194. const netizenEvaluateType = ref<EmptyArrayType>([]);
  195. /*
  196. * @param row 工单详情
  197. * @param isDisabled 是否查看详情
  198. * @description 打开弹窗
  199. * */
  200. const openDialog = async (row: any, isDisabled: boolean = false) => {
  201. disabled.value = isDisabled;
  202. state.loading = true;
  203. try {
  204. if (isDisabled) {
  205. state.orderDetail = row.order ?? {};
  206. const [response, res] = await Promise.all([publishOrderDetail(row.id), baseData(state.orderDetail.id)]);
  207. state.ruleForm = response.result ?? {};
  208. state.ruleForm.netizen = response.result?.netizenEvaluate?.key;
  209. state.publishDetail = res.result ?? {};
  210. idNamesArray.value = res.result?.idNames ?? [];
  211. netizenEvaluateType.value = res.result?.netizenEvaluateType ?? [];
  212. dialogTitle.value = '发布详情';
  213. state.loading = false;
  214. state.dialogVisible = true;
  215. } else {
  216. state.orderDetail = row ?? {};
  217. const res = await baseData(state.orderDetail.id);
  218. state.publishDetail = res.result ?? {};
  219. state.ruleForm.arrangeTitle = state.publishDetail.orderTitle;
  220. state.ruleForm.arrangeContent = state.publishDetail.content;
  221. state.ruleForm.arrangeOpinion = state.publishDetail.actualOpinion;
  222. idNamesArray.value = res.result?.idNames ?? [];
  223. netizenEvaluateType.value = res.result?.netizenEvaluateType ?? [];
  224. dialogTitle.value = '工单发布';
  225. state.loading = false;
  226. state.dialogVisible = true;
  227. }
  228. } catch (e) {
  229. console.log(e);
  230. state.loading = false;
  231. }
  232. };
  233. // 中国政府网特殊字段
  234. const isZGZFW = computed(() => {
  235. return state.orderDetail.provinceNo.includes('ZGZFW');
  236. });
  237. // 关闭弹窗
  238. const closeDialog = () => {
  239. state.dialogVisible = false;
  240. };
  241. const close = () => {
  242. ruleFormRef.value.clearValidate();
  243. ruleFormRef.value.resetFields();
  244. };
  245. // 发布
  246. const onPublish = (formEl: FormInstance | undefined) => {
  247. if (!formEl) return;
  248. formEl.validate((valid: boolean) => {
  249. if (!valid) return;
  250. state.loading = true;
  251. let idNames = [];
  252. state.ruleForm.netizenEvaluate = netizenEvaluateType.value.find((item) => item.key === state.ruleForm.netizen);
  253. if (state.ruleForm.idNames.length > 0) {
  254. // 如果选择了部门
  255. idNames = [...state.ruleForm.idNames];
  256. } else {
  257. idNames = [{ key: state.publishDetail.actualHandleOrgName?.key, value: state.publishDetail.actualHandleOrgName?.value }];
  258. }
  259. const request = {
  260. ...state.ruleForm,
  261. idNames,
  262. id: state.orderDetail.id,
  263. };
  264. publishOrder(request)
  265. .then(() => {
  266. ElMessage.success('发布成功');
  267. state.loading = false;
  268. closeDialog();
  269. emit('updateList');
  270. })
  271. .catch(() => {
  272. state.loading = false;
  273. });
  274. });
  275. };
  276. defineExpose({
  277. openDialog,
  278. closeDialog,
  279. });
  280. </script>