inspectionValue.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. <template>
  2. <view class="inspectionValue">
  3. <scroll-view scroll-y class="body">
  4. <uni-forms ref="baseForm" :model="formValues" :rules="rules" class="form" label-position="top">
  5. <template v-for="(item, index) of baseFormData" :key="index">
  6. <!-- 下拉 -->
  7. <uni-forms-item v-if="item.type === '1'" class="formItem" :label="item.name" :required="item.required" :name="item.key">
  8. <uni-data-picker :placeholder="'请选择' + item.name" :popup-title="'请选择' + item.name" :localdata="item.list" v-model="formValues[item.key]" @change="changeForm()">
  9. </uni-data-picker>
  10. </uni-forms-item>
  11. <!-- 单选 -->
  12. <uni-forms-item v-if="item.type === '2'" class="formItem" :label="item.name" :required="item.required" :name="item.key">
  13. <uni-data-checkbox v-model="formValues[item.key]" @change="changeForm()" :localdata="item.list" />
  14. </uni-forms-item>
  15. <!-- 多选 -->
  16. <uni-forms-item v-if="item.type === '3'" class="formItem" :label="item.name" :required="item.required" :name="item.key">
  17. <uni-data-checkbox v-model="formValues[item.key]" @change="changeForm()" multiple :localdata="item.list" />
  18. </uni-forms-item>
  19. <!-- 数字 -->
  20. <uni-forms-item v-if="item.type === '4'" class="formItem" :label="item.name" :required="item.required" :name="item.key">
  21. <uni-number-box v-model="formValues[item.key]" @change="changeForm()" :min="-9999" :max="9999" :placeholder="'请输入' + item.name"></uni-number-box>
  22. </uni-forms-item>
  23. <!-- 单行 -->
  24. <uni-forms-item v-if="item.type === '5' && item.isException" class="formItem" :label="item.name" :required="item.required" :name="item.key">
  25. <uni-easyinput v-model="formValues[item.key]" :placeholder="'请输入' + item.name" />
  26. </uni-forms-item>
  27. <!-- 多行 -->
  28. <uni-forms-item v-if="item.type === '6' && item.isException" class="formItem" :label="item.name" :required="item.required" :name="item.key">
  29. <uni-easyinput type="textarea" v-model="formValues[item.key]" :placeholder="'请输入' + item.name" />
  30. </uni-forms-item>
  31. <!-- 图片上传 -->
  32. <uni-forms-item v-if="item.type === '7' && item.isException" class="formItem" :label="item.name" :required="item.required" :name="item.key">
  33. <DsFilePicker v-model="formValues[item.key]"></DsFilePicker>
  34. </uni-forms-item>
  35. <!-- 分割线 -->
  36. <view class="detail_head" v-if="item.type === '8'">
  37. <text class="title">{{ item.name }}</text>
  38. </view>
  39. </template>
  40. </uni-forms>
  41. </scroll-view>
  42. <view class="foot_common_btns">
  43. <button @click="goBack" type="default" class="cancelButton btn">返回</button>
  44. <button @click="submit" type="default" class="primaryButton btn">保存</button>
  45. </view>
  46. </view>
  47. </template>
  48. <script setup>
  49. import fromPairs from 'lodash-es/fromPairs'
  50. import keyBy from 'lodash-es/keyBy'
  51. import DsFilePicker from '@/components/DsFilePicker.vue';
  52. import { ref, reactive } from 'vue'
  53. import { onLoad } from '@dcloudio/uni-app'
  54. import { api_addModel } from "@/http/api.js"
  55. import { defaultColor } from '@/static/js/theme.js'
  56. import { useSetTitle } from '@/share/useSetTitle.js'
  57. import { useMakePhoneCall } from '@/share/useMakePhoneCall.js'
  58. import { useGoBack } from '@/share/useGoBack.js'
  59. import { useLoginUserStore } from '@/stores/loginUser'
  60. import { useInspectionValueStore } from '@/stores/inspectionValue'
  61. import { forIn } from 'lodash-es';
  62. useSetTitle();
  63. const loginUserStore = useLoginUserStore();
  64. const { goBack } = useGoBack();
  65. const inspectionValueStore = useInspectionValueStore();
  66. // 主题颜色
  67. const primaryColor = ref(defaultColor)
  68. // 所有页码数据
  69. const formPageList = reactive([]);
  70. // 表单
  71. const baseForm = ref()
  72. const inspectionExecuteId = ref()
  73. // 数据-原始
  74. const dataInfo = reactive({})
  75. // 数据-检验
  76. const rules = reactive({})
  77. // 数据-填写值
  78. const formValues = reactive({})
  79. // 表单数据-渲染
  80. // 下拉框 1
  81. // 单选 2
  82. // 多选 3
  83. // 数值 4
  84. // 单行文本 5
  85. // 多行文本 6
  86. // 照片上传 7
  87. // 分割线 8
  88. const baseFormData = reactive([
  89. // { type: 1, name: '', value: '', list: [], required: false, checkType: 0, valueMin: '', valueMax: '', },
  90. // { type: 2, name: '', value: '', list: [], required: false, checkType: 0, valueMin: '', valueMax: '', },
  91. // { type: 3, name: '', value: [], list: [], required: false, checkType: 0, valueMin: '', valueMax: '', },
  92. // { type: 4, name: '', value: '', list: [], required: false, checkType: 0, valueMin: '', valueMax: '', },
  93. // { type: 5, name: '', value: '', list: [], required: false, checkType: 0, valueMin: '', valueMax: '', },
  94. // { type: 6, name: '', value: '', list: [], required: false, checkType: 0, valueMin: '', valueMax: '', },
  95. // { type: 7, name: '', value: [], list: [], required: false, checkType: 0, valueMin: '', valueMax: '', },
  96. ])
  97. // 修改
  98. function changeForm(){
  99. handleData(true);
  100. }
  101. // 保存
  102. function submit(){
  103. baseForm.value.validate().then(res => {
  104. console.log('success', res);
  105. uni.showLoading({
  106. title: "加载中",
  107. mask: true,
  108. });
  109. console.log(formValues);
  110. let postData = {
  111. account: loginUserStore.loginUser.user.account,
  112. valuesList: [],
  113. };
  114. // baseFormData
  115. for(let key in formValues){
  116. let obj = baseFormData.find(v => v.key === key);
  117. if(!((obj.type === '5' && !obj.isException) || (obj.type === '6' && !obj.isException) || (obj.type === '7' && !obj.isException))){
  118. let name = obj.name;
  119. let itemId = obj.id;
  120. let _formPageList = dataInfo.inspectionFormDTO?.formPageList || [];
  121. _formPageList = _formPageList.map(v => v.formItemList).flat();
  122. let formItem = _formPageList.find(v => v.id === itemId);
  123. postData.valuesList.push({
  124. taskId: inspectionExecuteId.value,
  125. nodeId: dataInfo.id,
  126. formId: dataInfo.inspectionFormDTO.id,
  127. itemId: formItem.id,
  128. pageId: formItem.pageId,
  129. orders: formItem.orders,
  130. name,
  131. valuex: (formItem.type.value === '1' || formItem.type.value === '2' || formItem.type.value === '3') ? '' : formValues[key].toString(),
  132. configIds: (formItem.type.value === '1' || formItem.type.value === '2' || formItem.type.value === '3') ? formValues[key].toString() : undefined,
  133. hosId: dataInfo.inspectionFormDTO.hosId,
  134. })
  135. }
  136. }
  137. console.log(postData);
  138. api_addModel(postData).then((res) => {
  139. uni.hideLoading();
  140. if (res.status == 200) {
  141. inspectionValueStore.clearInspectionValueData();
  142. uni.reLaunch({
  143. url: `/pages/inspection/inspectionExecute/inspectionExecute`
  144. })
  145. } else {
  146. uni.showToast({
  147. icon: 'none',
  148. title: res.msg || '请求数据失败!'
  149. });
  150. }
  151. });
  152. }).catch(err => {
  153. console.log('err', err);
  154. })
  155. }
  156. // 处理数据
  157. function handleData(isException = false){
  158. // 目前只取第一页
  159. let firstPage = formPageList[0]?.formItemList || [];
  160. firstPage = firstPage.filter( v => v.display === 1);
  161. firstPage = firstPage.map((v, i) => {
  162. let value = '';
  163. v.formItemConfigList = v.formItemConfigList || [];
  164. // value
  165. if(v.type.value === '3'){
  166. // 多选
  167. let arr = v.formItemConfigList.filter(v => v.checkDefault === 1);
  168. value = arr.length ? arr.map(v => v.id) : [];
  169. console.log('多选', value)
  170. } else if(v.type.value === '7'){
  171. // 图片
  172. value = [];
  173. } else if(v.type.value === '1' || v.type.value === '2') {
  174. // 单选或下拉
  175. let defaultValue = v.formItemConfigList.find(v => v.checkDefault === 1);
  176. value = defaultValue ? defaultValue.id : '';
  177. console.log('单选或下拉', value)
  178. } else{
  179. // 其他
  180. value = v.defaultValue;
  181. }
  182. return {
  183. id: v.id,
  184. key: `field${i}`,
  185. type: v.type.value,
  186. name: v.name,
  187. value: isException ? formValues[`field${i}`] : value,
  188. list: v.formItemConfigList ? v.formItemConfigList.map(v => ({text: v.name, value: v.id, checkException: v.checkException, uncheckException: v.uncheckException})) : [],
  189. required: v.required === 1,
  190. checkType: v.checkType,
  191. showError: v.showError,
  192. orders: v.orders,
  193. valueMin: v.checkType === 2 ? v.valueLow : ( v.checkType === 1 ? (v.valuex - v.valueGap) : undefined),
  194. valueMax: v.checkType === 2 ? v.valueUp : ( v.checkType === 1 ? (v.valuex + v.valueGap) : undefined),
  195. }
  196. });
  197. let firstPageBottom = firstPage.filter(v => v.type === '5' || v.type === '6');
  198. firstPage = firstPage.filter(v => v.type !== '5' && v.type !== '6' && v.type !== '7');
  199. // 其他项
  200. if(isException){
  201. firstPage.forEach(v => {
  202. // 下拉,单选
  203. if(v.type === '1' || v.type === '2'){
  204. let obj = v.list.find(vv => formValues[v.key] === vv.value);
  205. v.isException = obj ? obj.checkException === 1 : false;
  206. } else if(v.type === '3'){
  207. // 多选
  208. v.isException = v.list.some(vv => {
  209. if(formValues[v.key].includes(vv.value)){
  210. return vv.checkException === 1;
  211. }else{
  212. return false;
  213. }
  214. })
  215. } else if(v.type === '4'){
  216. v.isException = (v.value < v.valueMin) || (v.value > v.valueMax);
  217. }
  218. })
  219. }else{
  220. firstPage.forEach(v => {
  221. if(v.type === '1' || v.type === '2'){
  222. // 下拉,单选
  223. let obj = v.list.find(vv => v.value === vv.value);
  224. v.isException = obj ? obj.checkException === 1 : false;
  225. } else if(v.type === '3'){
  226. // 多选
  227. v.isException = v.list.some(vv => {
  228. if(v.value.includes(vv.value)){
  229. return vv.checkException === 1;
  230. }else{
  231. return false;
  232. }
  233. })
  234. } else if(v.type === '4'){
  235. // 数值
  236. v.isException = (formValues[v.key] < v.valueMin) || (formValues[v.key] > v.valueMax);
  237. }
  238. })
  239. }
  240. // 单行|多行|图片上传
  241. let someIsException = firstPage.filter(v => v.type !== '8').some(v => v.isException);
  242. console.log('someIsException=>', someIsException)
  243. firstPageBottom.forEach(v => {
  244. console.log('v.showError=>', v.showError)
  245. v.isException = (v.showError === 1 && someIsException) || v.showError === 0;
  246. })
  247. firstPage = firstPage.concat(firstPageBottom).sort((a, b) => a.orders - b.orders);
  248. console.log('firstPage=>', firstPage);
  249. Object.assign(baseFormData, firstPage);
  250. console.log('baseFormData=>', baseFormData);
  251. Object.assign(formValues, fromPairs(firstPage.filter(v => v.type !== '8').map(v => ([v.key, v.value]))));
  252. console.log('formValues=>', formValues);
  253. let rulesObj = keyBy(firstPage.filter(v => v.type !== '8'), 'key');
  254. console.log(rulesObj)
  255. for(let key in rulesObj){
  256. rulesObj[key] = {
  257. rules: [
  258. { required: rulesObj[key].required, errorMessage: `${rulesObj[key].name}不能为空` }
  259. ]
  260. }
  261. }
  262. Object.assign(rules, rulesObj);
  263. console.log('rules=>', rules);
  264. }
  265. onLoad((option) => {
  266. inspectionExecuteId.value = +option.inspectionExecuteId;
  267. // 巡检项
  268. if(inspectionValueStore.inspectionValue.data){
  269. Object.assign(dataInfo, inspectionValueStore.inspectionValue.data);
  270. Object.assign(formPageList, dataInfo.inspectionFormDTO?.formPageList || []);
  271. handleData()
  272. }
  273. })
  274. </script>
  275. <style lang="scss" scoped>
  276. .inspectionValue{
  277. height: 100%;
  278. display: flex;
  279. flex-direction: column;
  280. justify-content: space-between;
  281. .body{
  282. box-sizing: border-box;
  283. flex: 1;
  284. min-height: 0;
  285. padding-bottom: 24rpx;
  286. .formItem{
  287. padding: 24rpx 24rpx 0;
  288. margin-bottom: 0;
  289. }
  290. ::v-deep .uni-forms-item__label{
  291. width: auto!important;
  292. }
  293. .detail_head{
  294. padding: 24rpx;
  295. border-top: 1rpx solid #D2D2D2;
  296. border-bottom: 1rpx solid #D2D2D2;
  297. display: flex;
  298. justify-content: space-between;
  299. align-items: center;
  300. margin-top: 24rpx;
  301. &:first-of-type{
  302. border-top: none;
  303. margin-top: 0;
  304. }
  305. .title{
  306. font-size: 26rpx;
  307. color: $uni-primary;
  308. padding-left: 18rpx;
  309. position: relative;
  310. &:before{
  311. content: '';
  312. width: 8rpx;
  313. height: 25rpx;
  314. background-color: $uni-primary;
  315. position: absolute;
  316. left: 0;
  317. top: 50%;
  318. transform: translateY(-50%);
  319. }
  320. }
  321. }
  322. }
  323. }
  324. </style>