综合办公系统
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

chooseMoney.vue 9.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. <template>
  2. <div>
  3. <el-form>
  4. <el-form-item label="项目概况:">
  5. <table border="1">
  6. <tr>
  7. <td style="width: 250px">工作内容</td>
  8. <td>等级或比例尺</td>
  9. <td>单位</td>
  10. <td>工作量</td>
  11. <td style="width: 100px">要求完成时间</td>
  12. <td>备注</td>
  13. </tr>
  14. <tr v-for="(work, index) in workList" :key="index">
  15. <td>
  16. {{ work.content }}
  17. </td>
  18. <td>
  19. {{ work.scale }}
  20. </td>
  21. <td>
  22. {{ work.unit }}
  23. </td>
  24. <td>
  25. {{ work.workLoad }}
  26. </td>
  27. <td>
  28. {{ work.deadline }}
  29. </td>
  30. <td>
  31. {{ work.remark }}
  32. </td>
  33. </tr>
  34. </table>
  35. </el-form-item>
  36. <el-form-item label="预结算:">
  37. <table border="1">
  38. <tr>
  39. <td style="width: 100px">工作内容</td>
  40. <td>工作类别</td>
  41. <td>工作项目</td>
  42. <!-- <td>项目细项</td> -->
  43. <td>比例尺</td>
  44. <td>地类类型</td>
  45. <td style="width:90px;">单价</td>
  46. <td style="width:90px;">总工作量</td>
  47. <td style="width:70px;">系数</td>
  48. <td>总额</td>
  49. </tr>
  50. <tr v-for="(work, index) in workList" :key="index">
  51. <td>
  52. {{ work.content }}
  53. </td>
  54. <td>
  55. <el-select v-model="work.workType" :style="{ width: '100%' }" :loading="work.workSelect.workTypeLoading"
  56. @change="getWorkItemList(work, work.workType)">
  57. <el-option v-for="item in work.workSelect.workTypeList" :key="item.value" :label="item.label"
  58. :value="item.value">
  59. </el-option>
  60. </el-select>
  61. </td>
  62. <td>
  63. <el-select v-model="work.workItem" :style="{ width: '100%' }" :remote="true"
  64. @change="getScaleGradeList(work, work.workItem)">
  65. <el-option v-for="item in work.workSelect.workItemList" :key="item.value" :label="item.label"
  66. :value="item.value">
  67. </el-option>
  68. </el-select>
  69. </td>
  70. <!-- <td>
  71. <el-select v-model="work.subItem" :style="{ width: '100%' }"
  72. @change="getUnitPrice(work, work.workItem, work.subItem, work.scaleGrade, work.groundType)">
  73. <el-option v-for="item in work.workSelect.subItemList" :key="item.value" :label="item.label"
  74. :value="item.value">
  75. </el-option>
  76. </el-select>
  77. </td> -->
  78. <td>
  79. <el-select v-model="work.scaleGrade" :style="{ width: '100%' }"
  80. @change="getUnitPrice(work, work.workItem, work.subItem, work.scaleGrade, work.groundType)">
  81. <el-option v-for="item in work.workSelect.scaleGradeList" :key="item.value" :label="item.label"
  82. :value="item.value">
  83. </el-option>
  84. </el-select>
  85. </td>
  86. <td>
  87. <el-select v-model="work.groundType" :style="{ width: '100%' }"
  88. @change="getUnitPrice(work, work.workItem, work.subItem, work.scaleGrade, work.groundType)">
  89. <el-option key="一般地类" label="一般地类" value="一般地类">
  90. </el-option>
  91. <el-option key="复杂地类" label="复杂地类" value="复杂地类">
  92. </el-option>
  93. </el-select>
  94. </td>
  95. <td>
  96. {{ work.price }} / {{ work.unit }}
  97. </td>
  98. <td>
  99. {{ work.workLoad }}
  100. </td>
  101. <td>
  102. <el-input v-model="work.coefficient" placeholder="请输入系数" @blur="getTotal(work)"></el-input>
  103. </td>
  104. <td class="workTotal">
  105. {{ work.total }}
  106. </td>
  107. </tr>
  108. </table>
  109. <div style="color:red">tips:预结算表中的系数为:困难系统和调整系数相乘的值(1分制)。例如:困难系数1,调整系数0.8,最终系数为0.8</div>
  110. </el-form-item>
  111. <el-form-item label="预结算合计:">
  112. {{ settle }}<el-button @click="getSettle()" type="success" style="margin-left:30px;">计算</el-button>
  113. </el-form-item>
  114. </el-form>
  115. </div>
  116. </template>
  117. <script>
  118. import { getWorkTypeList, getWorkItemList, getSubItemList, getScaleGradeList, getUnitPrice } from '@/api/oa/price/price'
  119. import { deepClone } from '@/utils'
  120. export default {
  121. props: {
  122. workList: {
  123. type: Array,
  124. require: true
  125. }
  126. },
  127. data() {
  128. return {
  129. // 工作选项
  130. workSelect: {
  131. // 项目列表
  132. projectList: [],
  133. // 工作类别列表
  134. workTypeList: [],
  135. // 工作项目
  136. workItemList: [],
  137. // 项目细项
  138. subItemList: [],
  139. // 比例尺
  140. scaleGradeList: [],
  141. workTypeLoading: true,
  142. workItemLoading: true,
  143. subItemLoading: true,
  144. scaleGradeLoading: true,
  145. },
  146. settle: 0
  147. }
  148. },
  149. created() {
  150. for (let work of this.workList) {
  151. this.setValue(work, 'workSelect', deepClone(this.workSelect));
  152. this.getWorkTypeList(work);
  153. }
  154. },
  155. methods: {
  156. /* 获取工作类别 */
  157. getWorkTypeList(work) {
  158. getWorkTypeList().then(res => {
  159. if (res) {
  160. this.setValue(work.workSelect, 'workTypeList', this.setArray(res));
  161. this.setValue(work.workSelect, 'workTypeLoading', false);
  162. }
  163. });
  164. },
  165. /* 获取工作项目 */
  166. getWorkItemList(work, workType) {
  167. getWorkItemList({ workType: workType }).then(res => {
  168. if (res) {
  169. let workItemList = this.setArray(res);
  170. work.workSelect.workItemLoading = false;
  171. work.workSelect.workItemList = workItemList;
  172. work.workItem = workItemList[0].label;
  173. // this.getSubItemList(work, work.workItem);
  174. work.subItem = '';
  175. this.getScaleGradeList(work, work.workItem);
  176. }
  177. })
  178. },
  179. /* 获取项目细项 */
  180. getSubItemList(work, workItem) {
  181. getSubItemList({ workItem }).then(res => {
  182. if (res) {
  183. let subItemList = this.setArray(res);
  184. work.workSelect.subItemLoading = false;
  185. work.workSelect.subItemList = subItemList;
  186. work.subItem = subItemList[0].label;
  187. if (work.scaleGrade == undefined) {
  188. this.setValue(work, 'scaleGrade', '无');
  189. }
  190. if (work.groundType == undefined) {
  191. this.setValue(work, 'groundType', '一般地类');
  192. }
  193. this.getUnitPrice(work, work.workItem, work.subItem, work.scaleGrade, work.groundType);
  194. }
  195. })
  196. },
  197. /* 获取比例尺 */
  198. getScaleGradeList(work, workItem) {
  199. getScaleGradeList({ workItem }).then(res => {
  200. if (res) {
  201. let scaleGradeList = this.setArray(res);
  202. work.workSelect.scaleGradeLoading = false;
  203. work.workSelect.scaleGradeList = scaleGradeList;
  204. this.setValue(work, 'scaleGrade', scaleGradeList[0].label)
  205. // work.scaleGrade = scaleGradeList[0].label;
  206. if (work.scaleGrade == undefined) {
  207. this.setValue(work, 'scaleGrade', '无');
  208. }
  209. if (work.groundType == undefined) {
  210. this.setValue(work, 'groundType', '一般地类');
  211. }
  212. this.getUnitPrice(work, work.workItem, work.subItem, work.scaleGrade, work.groundType);
  213. }
  214. })
  215. },
  216. /* 获取单价 */
  217. getUnitPrice(work, workItem, subItem, scaleGrade, groundType) {
  218. getUnitPrice({ workItem, subItem, scaleGrade, priceType: groundType }).then(res => {
  219. if (res.length != 0) {
  220. work.priceId = res.data.id;
  221. this.setValue(work, 'price', res.data.price)
  222. this.setValue(work, 'coefficient', 1)
  223. if (work.workLoad != undefined || work.workLoad != '') {
  224. this.getTotal(work);
  225. }
  226. }
  227. })
  228. },
  229. /* 获取总额 */
  230. getTotal(work) {
  231. let total = this.calculateTotal(work.price, work.coefficient, work.workLoad, 1);
  232. this.setValue(work, 'total', total)
  233. },
  234. /* 计算总额 */
  235. calculateTotal(price, coefficient, workLoad, percent) {
  236. return ((parseFloat(price) * parseFloat(coefficient) * parseFloat(workLoad)) * percent).toFixed(2);
  237. },
  238. getSettle() {
  239. const elements = document.querySelectorAll(".workTotal");
  240. let sum = 0;
  241. if (elements.length > 0) {
  242. for (let e of elements) {
  243. sum = sum + Number(e.innerHTML);
  244. }
  245. this.settle = sum.toFixed(2)
  246. }
  247. let obj = {}
  248. obj.workList = this.workList;
  249. obj.settle = this.settle;
  250. console.log(this.workList);
  251. this.$emit('getSettle',obj)
  252. },
  253. //数组去重
  254. setArray(arr) {
  255. if (arr != [] && arr != undefined) {
  256. let datalist = [...new Set(arr)];
  257. let list = [];
  258. for (let i of datalist) {
  259. let obj = new Object();
  260. obj.label = i;
  261. obj.value = i;
  262. list.push(obj);
  263. }
  264. return list;
  265. } else {
  266. return [];
  267. }
  268. },
  269. setValue(key, name, val) {
  270. this.$set(key, name, val)
  271. }
  272. }
  273. }
  274. </script>
  275. <style lang="scss" scoped>
  276. table {
  277. /*居中*/
  278. // margin: 0 auto;
  279. /*边框*/
  280. /* border: 1px solid black; */
  281. text-align: center;
  282. border-collapse: collapse;
  283. /*设置背景颜色*/
  284. /* background-color: #bfa; */
  285. td {
  286. padding: 3px;
  287. }
  288. }
  289. </style>