drawer.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. <template>
  2. <el-drawer
  3. :visible.sync="drawer"
  4. direction="rtl"
  5. :append-to-body="true"
  6. size="100%"
  7. >
  8. <div slot="title" class="title">
  9. <span style="margin: 0" class="name">商机名称:{{ row.name }}</span>
  10. <span>商机来源:{{ row.sourceName }}</span>
  11. <span>商机阶段:{{ row.stageName }}</span>
  12. <span>负责人:{{ row.responsibleName }}</span>
  13. </div>
  14. <headerTitle title="摘要卡片" style="margin-top: 15px"></headerTitle>
  15. <div class="card">
  16. <span
  17. >预算:
  18. <el-input v-model="row.budget" @blur="inputChange">
  19. <template slot="append">万元</template>
  20. </el-input>
  21. </span>
  22. <span>
  23. 赢单率:
  24. <el-input v-model="row.winRate" @blur="inputChange">
  25. <template slot="append">%</template>
  26. </el-input></span
  27. >
  28. <span
  29. >预计结单日期:
  30. <el-date-picker
  31. v-model="row.expectedClosingDate"
  32. @blur="inputChange"
  33. value-format="yyyy-MM-dd"
  34. placeholder="请选择"
  35. type="date"
  36. class="filter-item"
  37. ></el-date-picker>
  38. </span>
  39. </div>
  40. <div class="ele-body" style="height: calc(100% - 124px)">
  41. <el-tabs v-model="activeName" style="width: 100%" type="border-card">
  42. <el-tab-pane label="详细信息" name="详细信息">
  43. <opportunityInfo ref="opportunityInfoRef"></opportunityInfo>
  44. </el-tab-pane>
  45. <el-tab-pane label="物品清单" name="物品清单">
  46. <inventoryTableDetails
  47. ref="inventoryTable"
  48. :isSinglePrice="false"
  49. :isTotalCount="false"
  50. :isDiscount="false"
  51. :cacheKeyUrl="cacheKeyUrl"
  52. ></inventoryTableDetails>
  53. </el-tab-pane>
  54. <el-tab-pane label="竞品" name="竞品">
  55. <businessAddTable
  56. ref="businessAddTable"
  57. @save="save"
  58. :isDrawer="true"
  59. ></businessAddTable>
  60. </el-tab-pane>
  61. <el-tab-pane label="关键人信息" name="关键人信息">
  62. <personnelAddTable
  63. :isDrawer="true"
  64. ref="personnelAddTable"
  65. @save="save"
  66. @getContactId="getContactId"
  67. ></personnelAddTable>
  68. </el-tab-pane>
  69. <el-tab-pane label="报价单" name="报价单">
  70. <quotation :key="row.id" :businessOpportunityData="row"></quotation>
  71. </el-tab-pane>
  72. <el-tab-pane label="销售合同" name="销售合同">
  73. <contractBook
  74. :key="row.id"
  75. :businessOpportunityData="row"
  76. ></contractBook>
  77. </el-tab-pane>
  78. <!-- <el-tab-pane label="销售订单" name="销售订单">
  79. <saleOrder :key="row.id"></saleOrder>
  80. </el-tab-pane> -->
  81. <el-tab-pane label="跟进记录" name="跟进记录">
  82. <followList ref="followListRef"></followList>
  83. </el-tab-pane>
  84. <el-tab-pane
  85. label="审批流程"
  86. name="审批流程"
  87. v-if="row.processInstanceId"
  88. >
  89. <bpmDetail
  90. v-if="row.processInstanceId && activeName == '审批流程'"
  91. :id="row.processInstanceId"
  92. ></bpmDetail>
  93. </el-tab-pane>
  94. </el-tabs>
  95. </div>
  96. </el-drawer>
  97. </template>
  98. <script>
  99. import {
  100. getDetail,
  101. UpdateInformation
  102. } from '@/api/saleManage/businessOpportunity';
  103. import dictMixins from '@/mixins/dictMixins';
  104. import opportunityInfo from './darwerComponents/opportunityInfo.vue';
  105. // import inventoryTable from '@/BIZComponents/inventoryTable.vue';
  106. import inventoryTableDetails from '@/BIZComponents/inventoryTableDetails.vue';
  107. import businessAddTable from './businessAddTable.vue';
  108. import personnelAddTable from './personnelAddTable.vue';
  109. import bpmDetail from '@/views/bpm/processInstance/detail.vue';
  110. //报价单
  111. import quotation from '@/views/saleManage/quotation/index.vue';
  112. //合同
  113. import contractBook from '@/views/contractManage/contractBook/index.vue';
  114. //销售订单
  115. import saleOrder from '@/views/saleManage/saleOrder/index.vue';
  116. //跟进
  117. import followList from './darwerComponents/followList.vue';
  118. export default {
  119. mixins: [dictMixins],
  120. components: {
  121. quotation,
  122. contractBook,
  123. saleOrder,
  124. followList,
  125. opportunityInfo,
  126. inventoryTableDetails,
  127. businessAddTable,
  128. personnelAddTable,
  129. bpmDetail
  130. },
  131. data() {
  132. return {
  133. drawer: false,
  134. title: '',
  135. activeName: '详细信息',
  136. row: { contactId: '' },
  137. content: '',
  138. cacheKeyUrl: 'eos-businessOpportunity-inventoryTableDetails'
  139. };
  140. },
  141. created() {},
  142. methods: {
  143. async open(row) {
  144. (this.activeName = '详细信息'), (this.row = await getDetail(row.id));
  145. this.drawer = true;
  146. this.$nextTick(() => {
  147. this.$refs.opportunityInfoRef.init(this.row);
  148. this.$refs.followListRef.init(this.row);
  149. this.$refs.businessAddTable &&
  150. this.$refs.businessAddTable.putTableValue(
  151. this.row.competAnalysisList
  152. );
  153. this.$refs.personnelAddTable &&
  154. this.$refs.personnelAddTable.putTableValue(
  155. this.row.partyList,
  156. this.row.contactId
  157. );
  158. this.$refs.inventoryTable &&
  159. this.$refs.inventoryTable.putTableValue(this.row);
  160. });
  161. },
  162. getValidate() {
  163. return Promise.all([
  164. new Promise((resolve, reject) => {
  165. this.$refs.businessAddTable.validateForm((valid) => {
  166. if (!valid) {
  167. reject(false);
  168. } else {
  169. resolve(true);
  170. }
  171. });
  172. }),
  173. new Promise((resolve, reject) => {
  174. this.$refs.personnelAddTable.validateForm((valid) => {
  175. if (!valid) {
  176. reject(false);
  177. } else {
  178. resolve(true);
  179. }
  180. });
  181. })
  182. ]);
  183. },
  184. inputChange() {
  185. this.save();
  186. },
  187. async save() {
  188. try {
  189. // 表单验证通过,执行保存操作
  190. await this.getValidate();
  191. this.loading = true;
  192. const commitData = {
  193. opportunity: this.row,
  194. competAnalysisList: this.$refs.businessAddTable.getTableValue(),
  195. partyList: this.$refs.personnelAddTable.getTableValue(),
  196. productList: this.row.productList
  197. };
  198. UpdateInformation(commitData)
  199. .then((res) => {
  200. this.loading = false;
  201. this.$message.success('修改成功');
  202. })
  203. .catch((e) => {
  204. //this.loading = false;
  205. });
  206. } catch (error) {
  207. console.log(error);
  208. // 表单验证未通过,不执行保存操作
  209. }
  210. },
  211. getContactId(fn) {
  212. fn(this.row.contactId);
  213. },
  214. handleClose(done) {
  215. this.$confirm('确认关闭?')
  216. .then((_) => {
  217. done();
  218. })
  219. .catch((_) => {});
  220. }
  221. }
  222. };
  223. </script>
  224. <style lang="scss" scoped>
  225. .ele-body {
  226. display: flex;
  227. }
  228. :deep(.el-tabs__content) {
  229. padding: 10px;
  230. height: calc(100% - 40px);
  231. overflow: auto;
  232. }
  233. :deep(.el-input.is-disabled .el-input__inner) {
  234. color: #606266;
  235. }
  236. .card {
  237. display: flex;
  238. padding: 15px;
  239. font-size: 16px;
  240. > span {
  241. flex: 1;
  242. align-items: center;
  243. display: flex;
  244. :deep(.el-input) {
  245. width: 300px;
  246. }
  247. }
  248. }
  249. .title {
  250. span {
  251. margin-left: 50px;
  252. }
  253. .name {
  254. font-weight: 800;
  255. color: #40a9ff;
  256. }
  257. }
  258. </style>