index.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. <template>
  2. <FormDialog width="640px" :title="title"
  3. :visible="editFormDialogVisible"
  4. :submitLoading="editFormDialogSubmitLoading"
  5. :defaultFormData="defaultFormData"
  6. :formDisabled="formDisabled"
  7. :formItemList="finalFormItemList"
  8. @close="CloseFormDialog"
  9. @confirm="HandleConfirmFormDialog"
  10. @formItemChange="HandleFormItemChange">
  11. </FormDialog>
  12. </template>
  13. <script setup lang="ts">
  14. import { onMounted, ref,watch} from 'vue';
  15. import { useStore } from 'vuex';
  16. import { useRoute } from 'vue-router';
  17. import FormDialog from '@/baseComponents/FormDialog.vue';
  18. import {formItemList} from './formDialog'
  19. import {addFollowUpInfoApi} from '@/api/myCustomer'
  20. import {getPrivateContactListApi} from '@/api/myCustomer'
  21. import {unioformDateTransform} from '@/utils/dateTransform'
  22. interface FollowUpInfo{
  23. id:string,
  24. school:string,
  25. product:string,
  26. status:string,
  27. contact:string,
  28. position:string,
  29. content:string,
  30. appointmentTime:string,
  31. todoTime:string,
  32. appointmentType:Boolean | number, // 预约待办的判断标识 或者 查看为待办的前提下——当前值为false 表示 待办已手动关闭
  33. extraAppointmentType:number, //(预约待办的附加判断标识) //表单为查看(预览)模式时使用,0:预约,1:待办
  34. }
  35. const props = defineProps({
  36. defaultFormData:{
  37. type:Object as () => FollowUpInfo,
  38. required:true
  39. }, // extraAppointmentType(预约待办的判断标识) //表单为查看(预览)模式时使用,
  40. title:{
  41. type:String,
  42. default:'写跟进'
  43. },
  44. previewForm:{
  45. type:Boolean,
  46. default:false
  47. }, //是否是查看(预览)表单
  48. formDisabled:{
  49. type:Boolean,
  50. default:false
  51. }, //表单是否禁选
  52. itemDisabled:{
  53. type:Boolean,
  54. default:false
  55. }, //表单元素是否禁选
  56. customerId:{
  57. type:String,
  58. } //客户id,不在详情页获取id的时候使用
  59. })
  60. const emit = defineEmits(['confirm'])
  61. const editFormDialogVisible = defineModel('visible')
  62. const store = useStore()
  63. const route = useRoute()
  64. /**表单有关数据及操作 */
  65. const finalFormItemList = ref(JSON.parse(JSON.stringify(formItemList.value)))
  66. // const editFormDialogSubmitLoading = ref(false)
  67. const editFormDialogSubmitLoading = defineModel('submitLoading',{default: false })
  68. const CloseFormDialog = ()=>{
  69. editFormDialogVisible.value = false
  70. editFormDialogSubmitLoading.value = false
  71. }
  72. // 新增确认
  73. const HandleConfirmFormDialog = async (params)=>{
  74. if(props.itemDisabled){
  75. CloseFormDialog()
  76. emit('confirm')
  77. return
  78. }
  79. const {formData} = params
  80. if(!props.previewForm){
  81. editFormDialogSubmitLoading.value = true
  82. let orderDatetime = formData.appointmentType == 0 ?
  83. formData.appointmentTime :
  84. (formData.appointmentType == 1 ?
  85. formData.todoTime : "")
  86. let finalParams = {
  87. customerId: route.query.id,
  88. productId: JSON.parse(formData.product).value,
  89. followId: JSON.parse(formData.status).value,
  90. followName: JSON.parse(formData.status).label,
  91. customerPersonId: JSON.parse(formData.contact).id,
  92. positionId: JSON.parse(formData.position).value,
  93. followContent: formData.content,
  94. orderType: formData.appointmentType,
  95. orderDatetime:unioformDateTransform(orderDatetime)
  96. }
  97. let res = await addFollowUpInfoApi(finalParams)
  98. if(res?.code == 200){
  99. CloseFormDialog()
  100. emit('confirm')
  101. }else{
  102. editFormDialogSubmitLoading.value = false
  103. }
  104. }else{
  105. emit('confirm',params)
  106. }
  107. }
  108. // 表单项变更操作
  109. const HandleFormItemChange =(params)=>{
  110. const { key,val,formData } = params
  111. switch(key){
  112. case 'contact':
  113. if(val){
  114. let aimPosition = JSON.stringify({
  115. label:JSON.parse(val).positionName,
  116. value:JSON.parse(val).positionId
  117. })
  118. formData.position = store.state.positionList.find(item=>{
  119. return item.value = aimPosition
  120. })?.value
  121. }else{
  122. formData.position = null
  123. }
  124. break
  125. }
  126. }
  127. /**联系人信息获取 */
  128. const contactPeopleList = ref([])
  129. // 获取联系人列表
  130. const GetContactList = async ()=>{
  131. let params = {
  132. customerId: route.query.id || props.customerId,
  133. userId:'',
  134. queryStr: "",
  135. positionId:''
  136. }
  137. let res = await getPrivateContactListApi(params)
  138. if(res?.code == 200){
  139. contactPeopleList.value = res.data.map(item=>{
  140. return {
  141. label:item.name,
  142. value:JSON.stringify({
  143. id:item.id,
  144. positionId:item.positionId,
  145. positionName:item.positionName
  146. }),
  147. }
  148. }) || []
  149. finalFormItemList.value = finalFormItemList.value.map(item=>{
  150. if(item.key == 'contact'){
  151. item.selectList = contactPeopleList.value
  152. }
  153. return item
  154. })
  155. }
  156. }
  157. // 监听表单的职务信息是否展示
  158. watch(()=>props?.defaultFormData?.contact,(newVal)=>{
  159. if(newVal){
  160. finalFormItemList.value = finalFormItemList.value.map(item=>{
  161. if(item.key == 'position'){
  162. item.hidden = false
  163. }
  164. return item
  165. })
  166. }else{
  167. finalFormItemList.value = finalFormItemList.value.map(item=>{
  168. if(item.key == 'position'){
  169. item.hidden = true
  170. }
  171. return item
  172. })
  173. }
  174. },{deep:true,immediate:true})
  175. // 监听预约待办时间是否展示
  176. watch([()=>props?.defaultFormData?.appointmentType,
  177. ()=>props.previewForm
  178. ],([newTypeVal,newPreviewFormVal])=>{
  179. let appointmentTypeFlag = null
  180. if(newPreviewFormVal){
  181. appointmentTypeFlag = (newTypeVal ? props.defaultFormData.extraAppointmentType : null)
  182. }else{
  183. appointmentTypeFlag = newTypeVal
  184. }
  185. // appointmentTypeFlag 0 预约 1 待办
  186. finalFormItemList.value = finalFormItemList.value.map(item=>{
  187. switch(item.key){
  188. case 'appointmentType':
  189. // 查看详情的时候,待办项 开关关闭后,不允许在打开
  190. item.disabled = newPreviewFormVal ? (newTypeVal ? false : true) : false
  191. // 查看详情的时候, 属于待办项 才会展示待办开关
  192. item.hidden = newPreviewFormVal ? ([1].includes(props.defaultFormData.extraAppointmentType) ? false : true) : false
  193. break;
  194. case 'appointmentTime':
  195. item.hidden = [0].includes(appointmentTypeFlag) ? false : true
  196. break
  197. case 'todoTime':
  198. item.hidden = [1].includes(appointmentTypeFlag) ? false : true
  199. break
  200. }
  201. return item
  202. })
  203. },{deep:true,immediate:true})
  204. // 根据表单的查看模式展示不同的 表单项
  205. watch(()=>props.previewForm,async (newVal)=>{
  206. if(newVal){
  207. finalFormItemList.value = finalFormItemList.value.map(item=>{
  208. switch(item.key){
  209. case 'school':
  210. case 'product':
  211. case 'status':
  212. case 'contact':
  213. case 'position':
  214. case 'content':
  215. case 'appointmentTime':
  216. case 'todoTime':
  217. item.type = 'text'
  218. break
  219. case 'appointmentType':
  220. item.type ='switch'
  221. break
  222. }
  223. item.rules = []
  224. return item
  225. })
  226. }else{
  227. await store.dispatch('updateProductList')
  228. await store.dispatch('updateFollowUpStatus')
  229. await store.dispatch('updatePositionList')
  230. await GetContactList()
  231. finalFormItemList.value = finalFormItemList.value.map(item=>{
  232. if(item.key == 'product'){
  233. item.selectList = store.state.productList
  234. }else if(item.key == 'status'){
  235. item.selectList = store.state.followUpStatus
  236. }else if(item.key == 'position'){
  237. item.selectList = store.state.positionList
  238. }
  239. return item
  240. })
  241. }
  242. },{immediate:true})
  243. watch(()=>props.itemDisabled,(newVal)=>{
  244. if(newVal){
  245. finalFormItemList.value = finalFormItemList.value.map(item=>{
  246. item.disabled = true
  247. return item
  248. })
  249. }
  250. },{immediate:true})
  251. onMounted(async ()=>{
  252. const disabledData = (date)=>{
  253. // 如果传入的日期时间戳小于当前时间戳,则禁用(返回 true)
  254. return date.getTime() < Date.now();
  255. }
  256. finalFormItemList.value = finalFormItemList.value.map(item=>{
  257. switch(item.key){
  258. case 'appointmentTime':
  259. case 'todoTime':
  260. item.disabledDate = disabledData
  261. break
  262. }
  263. return item
  264. })
  265. })
  266. </script>
  267. <style lang="scss" scoped>
  268. </style>