index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. <template>
  2. <el-dialog v-model="props.visible" width="800px" :show-close="false" :close-on-click-modal="false" top="10vh">
  3. <template #header="{ titleId, titleClass }">
  4. <div class="flex justify-between items-center border-b pb-3">
  5. <h4 :id="titleId" :class="titleClass">{{ editForm ? '编辑任务' : '新增任务' }}</h4>
  6. <div>
  7. <el-button v-if="!editForm" type="primary" :loading="['2'].includes(props.saveLoading)"
  8. @click="submitForm(formRef, true)">保存并新建</el-button>
  9. <el-button type="primary" :loading="['2'].includes(props.saveLoading)"
  10. @click="submitForm(formRef, false)">保存</el-button>
  11. <el-button @click="closeVisible()">取消</el-button>
  12. </div>
  13. </div>
  14. </template>
  15. <div class="h-[55vh] overflow-y-auto scroll-bar mt-5">
  16. <el-form ref="formRef" :model="form" label-width="7em" :rules="rules" class="flex flex-wrap form">
  17. <el-form-item label="任务名称:" prop="taskName" required>
  18. <el-input v-model="form.taskName" type="textarea" placeholder="请输入任务名称" clearable maxlength="100"
  19. show-word-limit />
  20. </el-form-item>
  21. <el-form-item prop="priority" label="优先级:" required>
  22. <el-select v-model="form.priority" placeholder="请选择" clearable>
  23. <el-option v-for="item in PRIORITY " :key="item.value" :value="item.value" :label="item.label" />
  24. </el-select>
  25. </el-form-item>
  26. <el-form-item :label="form.taskType">
  27. <template #label>
  28. <el-select v-model="form.taskType" class="border resetSelect" style="width: 100px" @change="changeTaskType">
  29. <el-option v-for="item in TASK_TYPE" :key="item.value" :value="item.value" :label="item.label" />
  30. </el-select>
  31. </template>
  32. <template v-for="item in TASK_TYPE_FIELD">
  33. <el-select v-model="form[item.field]" v-if="form.taskType == item.type" placeholder="请选择" clearable
  34. filterable>
  35. <el-option v-for="item in taskTypeValueData" :key="item.value" :value="item.value" :label="item.label" />
  36. </el-select>
  37. </template>
  38. </el-form-item>
  39. <el-form-item label="联系人:" v-if="TASK_TYPE.find(v => v.value === (form.taskType || '1'))?.show">
  40. <el-select v-model="form.contactsId" placeholder="请选择" clearable filterable>
  41. <el-option v-for="item in contactValueData" :key="item.value" :value="item.value" :label="item.label" />
  42. </el-select>
  43. </el-form-item>
  44. <el-form-item label="执行人:">
  45. <el-select v-model="form.executorId" placeholder="请选择" clearable multiple filterable>
  46. <el-option v-for="item in executorValueData" :key="item.value" :value="item.value" :label="item.label" />
  47. </el-select>
  48. </el-form-item>
  49. <el-form-item label="重复提醒:">
  50. <el-switch v-model="form.repeat" :active-value="1" :inactive-value="0" @change="changeRepeat" />
  51. </el-form-item>
  52. <template v-if="form.repeat === 1">
  53. <el-form-item label="重复类型:">
  54. <el-select v-model="form.repeatType" placeholder="请选择" @change="changeRepeatType">
  55. <el-option v-for="item in REPEAT_TYPE" :key="item.value" :value="item.value" :label="item.label" />
  56. </el-select>
  57. </el-form-item>
  58. <template v-if="[0,1,2,3].includes(form.repeatType)">
  59. <el-form-item label="每:" v-if="form.repeatType == 3">
  60. <el-input-number v-model="form.repeatDesignSameday" controls-position="right" :min="1" />天
  61. </el-form-item>
  62. <el-form-item label="结束:">
  63. <el-radio-group v-model="form.endType" @change="changeEndType">
  64. <el-radio label="1" class="w-full">永不</el-radio>
  65. <el-radio label="2" class="w-full mb-3"><el-input-number v-model="form.repeatEndCount" :min="1"
  66. controls-position="right" />
  67. 次以后
  68. </el-radio>
  69. <el-radio label="3" class="w-full">
  70. <el-date-picker v-model="form.repeatEndDate" type="date" placeholder="选择日期" style="width:65%"
  71. :disabled-date="(value: Date) => (new Date() > new Date(value))" />
  72. 以后
  73. </el-radio>
  74. </el-radio-group>
  75. </el-form-item>
  76. </template>
  77. <template v-if="[4].includes(form.repeatType)">
  78. <el-form-item v-for="(v, i) in customeDate" class="flex justify-between items-center customeDate">
  79. <div>
  80. 第{{ i + 1 }}次重复在
  81. <el-input-number :model-value="Number(v)" controls-position="right" @change="changeDate(i, $event)"
  82. :min="1" />
  83. 天后
  84. </div>
  85. <div>
  86. <el-icon size="24" @click="deleteCustomeDateItem(i)" class=" hover:text-blue-500 cursor-pointer">
  87. <Delete />
  88. </el-icon>
  89. </div>
  90. </el-form-item>
  91. <el-form-item>
  92. <div>
  93. <el-icon size="24" @click="addCustomeDateItem()" class=" hover:text-blue-500 cursor-pointer">
  94. <Plus />
  95. </el-icon>
  96. </div>
  97. </el-form-item>
  98. </template>
  99. </template>
  100. <el-form-item label="开始时间:" class="w50">
  101. <el-date-picker v-model="form.startDate" type="date" placeholder="选择日期" value-format="YYYY-MM-DD" />
  102. </el-form-item>
  103. <el-form-item label="截止时间:" class="w50">
  104. <el-date-picker v-model="form.endDate" type="date" placeholder="选择日期" value-format="YYYY-MM-DD" />
  105. </el-form-item>
  106. </el-form>
  107. <GenerateForm ref="generateFormRef" :data="generateFormData" :value="form" />
  108. <div v-if="editForm">
  109. <el-form-item label="操作记录" label-width="7em">
  110. <div class="w-full">
  111. <div v-for="item in form.taskLogs" class=" border-b-2 w-full pl-3">
  112. {{ `${item.modTime} ${item.userName} ${item.content}` }}
  113. </div>
  114. </div>
  115. </el-form-item>
  116. </div>
  117. </div>
  118. </el-dialog>
  119. </template>
  120. <script lang="ts" setup>
  121. import { ref, watch } from 'vue';
  122. import { PRIORITY, TASK_TYPE, TASK_TYPE_FIELD, defalutModalForm, REPEAT_TYPE, CUSTOMER_FORM_URL, defaultGenerateFormData } from "./api";
  123. import { GenerateForm } from "@zmjs/form-design"
  124. import { get } from '@/utils/request';
  125. import { Delete, Plus } from "@element-plus/icons-vue"
  126. import { FormInstance } from 'element-plus';
  127. import { getFromValue } from '@/utils/tools';
  128. import { Props, Emits } from './type';
  129. const props = defineProps<Props>()
  130. const emits = defineEmits<Emits>();
  131. watch(() => props.saveLoading, (val) => {
  132. if (val == "3") {
  133. formRef.value?.resetFields();
  134. form.value = { ...defalutModalForm };
  135. }
  136. })
  137. watch(() => props.visible, (val) => {
  138. formRef.value?.resetFields();
  139. if (val) {
  140. get(CUSTOMER_FORM_URL).then(res => {
  141. if (Array.isArray(res.data) && res.data.length > 0) {
  142. generateFormData.value = JSON.parse(res.data[0].config)
  143. }
  144. })
  145. }
  146. })
  147. watch(() => props.editForm, (val) => {
  148. if (!val) {
  149. //TODO 如果是新增
  150. form.value = { ...defalutModalForm };
  151. taskTypeValueData.value = [{ label: '客户1', value: 1 }, { label: '客户2', value: 2 }];
  152. contactValueData.value = [{ label: '联系人1', value: 1 }, { label: '联系人2', value: 2 }];
  153. executorValueData.value = [{ label: '执行人1', value: 1 }, { label: '执行人2', value: 2 }];
  154. return
  155. }
  156. //TODO 如果是编辑
  157. form.value = { ...val };
  158. customeDate.value = (form.value.repeatDesignDay || "").split(',').filter(Boolean);
  159. console.log("customeDate.value ", customeDate.value, form.value.repeatDesignDay);
  160. changeTaskType(form.value.taskType)
  161. contactValueData.value = [{ label: '联系人1', value: 1 }, { label: '联系人2', value: 2 }];
  162. executorValueData.value = [{ label: '执行人1', value: 1 }, { label: '执行人2', value: 2 }];
  163. })
  164. const rules = ref({
  165. taskName: [
  166. { required: true, message: '请输入任务名称', trigger: 'blur' }
  167. ],
  168. priority: [
  169. { required: true, message: '请选择优先级', trigger: 'change' }
  170. ]
  171. })
  172. const form = ref<any>({});
  173. const formRef = ref<FormInstance>();
  174. const generateFormRef = ref<InstanceType<typeof GenerateForm>>();
  175. const generateFormData = ref<any>(defaultGenerateFormData);
  176. function closeVisible() {
  177. generateFormData.value = defaultGenerateFormData;
  178. emits('close')
  179. }
  180. function submitForm(formEl: FormInstance | undefined, isClose: boolean) {
  181. if (!formEl) return
  182. formEl.validate((valid) => {
  183. if (!valid) {
  184. return false
  185. }
  186. const repeatDesignDay = customeDate.value.join(",")
  187. generateFormRef.value?.getData().then((res: any) => {
  188. let submitData = getFromValue({
  189. ...form.value,
  190. repeatDesignDay,
  191. ...res
  192. })
  193. emits('submit', submitData, isClose)
  194. }).catch((err: any) => {
  195. console.log(err);
  196. })
  197. })
  198. }
  199. const taskTypeValueData = ref<any>([])
  200. function changeTaskType(value: TASK_VALUE_TYPE) {
  201. form.value = {
  202. ...form.value,
  203. taskType: value,
  204. customerId: null, // 客户id 0
  205. businessId: null, //商机id 1
  206. orderId: null, // 订单id 2
  207. clueId: null, //线索id 3
  208. contactsId: null, //联系人id
  209. }
  210. switch (value) {
  211. case 0:
  212. taskTypeValueData.value = [];
  213. setTimeout(() => {
  214. taskTypeValueData.value = [{ label: '客户1', value: 1 }, { label: '客户2', value: 2 }];
  215. }, 500)
  216. break;
  217. case 1:
  218. taskTypeValueData.value = [];
  219. setTimeout(() => {
  220. taskTypeValueData.value = [{ label: "商机1", value: 1 }, { label: "商机2", value: 2 }]
  221. }, 500)
  222. break;
  223. case 2:
  224. taskTypeValueData.value = [];
  225. setTimeout(() => {
  226. taskTypeValueData.value = [{ label: "订单1", value: 1 }, { label: "订单2", value: 2 }]
  227. }, 500)
  228. break;
  229. case 3:
  230. taskTypeValueData.value = [];
  231. setTimeout(() => {
  232. taskTypeValueData.value = [{ label: "线索1", value: 1 }, { label: "线索2", value: 2}]
  233. }, 500)
  234. break;
  235. default:
  236. const _n: never = value;
  237. break;
  238. }
  239. }
  240. const contactValueData = ref<any>([])
  241. const executorValueData = ref<any>([])
  242. function changeRepeat(value: string | number | boolean) {
  243. form.value = {
  244. ...form.value,
  245. repeat: value,
  246. repeatType: 0, //重复类型
  247. endType: 1, //结束类型
  248. repeatEndNever: 1,
  249. repeatEndCount: null, //重复指定次数次数后结束
  250. repeatEndDate: null, //重复到指定日期后结束
  251. repeatDesignDay: null, //自定义日期
  252. repeatDesignSameday: null, //自定义周期
  253. }
  254. customeDate.value = [];
  255. }
  256. function changeRepeatType(value: REPEAT_VALUE_TYPE) {
  257. form.value = {
  258. ...form.value,
  259. repeatType: value, //重复类型
  260. endType: 1, //结束类型
  261. repeatEndNever: 1,
  262. repeatEndCount: null, //重复指定次数次数后结束
  263. repeatEndDate: null, //重复到指定日期后结束
  264. repeatDesignDay: null, //自定义日期
  265. repeatDesignSameday: null, //自定义周期
  266. }
  267. customeDate.value = [];
  268. }
  269. function changeEndType(value: string | number | boolean) {
  270. form.value = {
  271. ...form.value,
  272. endType: value, //重复类型
  273. repeatEndNever: value == 1 ? 1 : null,//永不结束
  274. repeatEndCount: null, //重复指定次数次数后结束
  275. repeatEndDate: null, //重复到指定日期后结束
  276. repeatDesignDay: null, //自定义日期
  277. repeatDesignSameday: null, //自定义周期
  278. }
  279. }
  280. const customeDate = ref<any>([])
  281. function changeDate(index: number, value: number | undefined) {
  282. customeDate.value[index] = value;
  283. }
  284. function deleteCustomeDateItem(index: number) {
  285. customeDate.value = customeDate.value.filter((_item: number, i: number) => i !== index);
  286. }
  287. function addCustomeDateItem() {
  288. customeDate.value.push(undefined)
  289. }
  290. </script>
  291. <style lang="scss">
  292. .resetSelect {
  293. border: 0;
  294. .el-select__wrapper {
  295. box-shadow: none;
  296. padding-right: 0;
  297. }
  298. .el-select__selected-item {
  299. text-align: right;
  300. }
  301. }
  302. .customeDate {
  303. .el-form-item__content {
  304. justify-content: space-between;
  305. }
  306. }
  307. .el-form-item {
  308. width: 100%;
  309. }
  310. .form {
  311. .w50 {
  312. @apply w-1/2;
  313. }
  314. }
  315. </style>