index.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. <template>
  2. <div class="app-container">
  3. <!-- 搜索条件区域 -->
  4. <div class="search-container">
  5. <el-collapse-transition>
  6. <div v-show="searchExpanded">
  7. <el-form :model="searchForm" class="search-form" label-width="100px">
  8. <el-row :gutter="20">
  9. <!-- 第一行:基本信息 -->
  10. <el-col :xs="24" :sm="12" :md="8" :lg="6">
  11. <el-form-item label="商机名称" prop="opportunityName">
  12. <el-input v-model="searchForm.opportunityName" placeholder="请输入商机名称" clearable></el-input>
  13. </el-form-item>
  14. </el-col>
  15. <el-col :xs="24" :sm="12" :md="8" :lg="6">
  16. <el-form-item label="商机编号" prop="opportunityCode">
  17. <el-input v-model="searchForm.opportunityCode" placeholder="请输入商机编号" clearable></el-input>
  18. </el-form-item>
  19. </el-col>
  20. <el-col :xs="24" :sm="12" :md="8" :lg="6">
  21. <el-form-item label="商机单位" prop="opportunityUnit">
  22. <el-input v-model="searchForm.opportunityUnit" placeholder="请输入商机单位" clearable></el-input>
  23. </el-form-item>
  24. </el-col>
  25. <!-- <el-col :xs="24" :sm="12" :md="8" :lg="6">
  26. <el-form-item label="指标标签" prop="indicatorTag">
  27. <el-input v-model="searchForm.indicatorTag" placeholder="请输入指标标签" clearable></el-input>
  28. </el-form-item>
  29. </el-col> -->
  30. <!-- 第二行:客户与负责人信息 -->
  31. <el-col :xs="24" :sm="12" :md="8" :lg="6">
  32. <el-form-item label="自然客户名称" prop="naturalCustomerName">
  33. <el-input v-model="searchForm.naturalCustomerName" placeholder="请输入自然客户名称" clearable></el-input>
  34. </el-form-item>
  35. </el-col>
  36. <el-col :xs="24" :sm="12" :md="8" :lg="6">
  37. <el-form-item label="商机归属人" prop="opportunityOwner">
  38. <el-input v-model="searchForm.opportunityOwner" placeholder="请输入商机归属人" clearable></el-input>
  39. </el-form-item>
  40. </el-col>
  41. <el-col :xs="24" :sm="12" :md="8" :lg="6">
  42. <el-form-item label="支撑负责人" prop="supportPerson">
  43. <el-input v-model="searchForm.supportPerson" placeholder="请输入支撑负责人" clearable></el-input>
  44. </el-form-item>
  45. </el-col>
  46. <el-col :xs="24" :sm="12" :md="8" :lg="6">
  47. <el-form-item label="支撑单位" prop="supportUnit">
  48. <el-input v-model="searchForm.supportUnit" placeholder="请输入支撑单位" clearable></el-input>
  49. </el-form-item>
  50. </el-col>
  51. <!-- 第三行:合同与项目信息 -->
  52. <!-- <el-col :xs="24" :sm="12" :md="8" :lg="6">
  53. <el-form-item label="合同编号" prop="contractCode">
  54. <el-input v-model="searchForm.contractCode" placeholder="请输入合同编号" clearable></el-input>
  55. </el-form-item>
  56. </el-col> -->
  57. <!-- <el-col :xs="24" :sm="12" :md="8" :lg="6">
  58. <el-form-item label="项目编号" prop="projectCode">
  59. <el-input v-model="searchForm.projectCode" placeholder="请输入项目编号" clearable></el-input>
  60. </el-form-item>
  61. </el-col> -->
  62. <el-col :xs="24" :sm="12" :md="8" :lg="6">
  63. <el-form-item label="商机阶段" prop="opportunityStage">
  64. <el-select v-model="searchForm.opportunityStage" placeholder="请选择商机阶段" clearable>
  65. <el-option v-for="item in opportunityStageOptions" :key="item.value" :label="item.label"
  66. :value="item.value"></el-option>
  67. </el-select>
  68. </el-form-item>
  69. </el-col>
  70. </el-row>
  71. <!-- 日期选择区域 -->
  72. <el-row :gutter="20" class="date-row">
  73. <!-- <el-col :xs="24" :sm="12" :md="12" :lg="8">
  74. <el-form-item label="立项时间" prop="approvalDate" label-position="top">
  75. <el-date-picker v-model="searchForm.approvalDate" type="daterange" range-separator="至"
  76. start-placeholder="开始日期" end-placeholder="结束日期" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
  77. clearable style="width: 100%"></el-date-picker>
  78. </el-form-item>
  79. </el-col> -->
  80. <el-col :xs="24" :sm="12" :md="12" :lg="8">
  81. <el-form-item label="预计签约时间" prop="estimatedSignDate" label-position="top">
  82. <el-date-picker v-model="searchForm.estimatedSignDate" type="daterange" range-separator="至"
  83. start-placeholder="开始日期" end-placeholder="结束日期" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
  84. clearable style="width: 100%"></el-date-picker>
  85. </el-form-item>
  86. </el-col>
  87. <!-- <el-col :xs="24" :sm="12" :md="12" :lg="8">
  88. <el-form-item label="签约时间" prop="signDate" label-position="top">
  89. <el-date-picker v-model="searchForm.signDate" type="daterange" range-separator="至"
  90. start-placeholder="开始日期" end-placeholder="结束日期" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
  91. clearable style="width: 100%"></el-date-picker>
  92. </el-form-item>
  93. </el-col> -->
  94. </el-row>
  95. <!-- 操作按钮区域 -->
  96. <el-row>
  97. <el-col :span="24" class="form-actions">
  98. <el-form-item>
  99. <el-button type="primary" @click="handleSearch" :loading="searchLoading">搜索</el-button>
  100. <el-button @click="handleReset">重置</el-button>
  101. </el-form-item>
  102. </el-col>
  103. </el-row>
  104. </el-form>
  105. </div>
  106. </el-collapse-transition>
  107. <!-- <el-button type="text" @click="toggleSearch" class="toggle-btn">
  108. {{ searchExpanded ? '收起搜索 ^' : '展开搜索 v' }}
  109. </el-button> -->
  110. </div>
  111. <!-- 商机列表区域 -->
  112. <div class="list-container">
  113. <!-- <div class="list-header">
  114. <el-button type="primary" @click="handleAdd">新增商机</el-button>
  115. </div> -->
  116. <el-table :data="bizList" header-align="center" style="width: 100%" stripe v-loading="tableLoading" border>
  117. <el-table-column prop="opportunityName" label="商机名称" min-width="150" align="center"
  118. fixed="left"></el-table-column>
  119. <el-table-column prop="opportunityCode" label="商机编号" min-width="120" align="center"></el-table-column>
  120. <el-table-column prop="naturalCustomerName" label="自然客户名称" min-width="180" align="center"></el-table-column>
  121. <el-table-column prop="naturalCustomerId" label="自然客户ID" min-width="100" align="center"></el-table-column>
  122. <el-table-column prop="estimatedContractAmount" label="预计合同总金额(万元)" min-width="120"
  123. align="center"></el-table-column>
  124. <el-table-column prop="estimatedSignDate" label="预计签约时间" min-width="100" align="center">
  125. <template slot-scope="scope">
  126. {{ parseTime(scope.row.estimatedSignDate, '{y}-{m}-{d}') || '-' }}
  127. </template>
  128. </el-table-column>
  129. <el-table-column prop="opportunityOwner" label="商机归属人" min-width="120" align="center"></el-table-column>
  130. <el-table-column prop="opportunityUnit" label="商机单位" min-width="120" align="center"></el-table-column>
  131. <el-table-column prop="supportPerson" label="支撑负责人" min-width="120" align="center"></el-table-column>
  132. <el-table-column prop="supportUnit" label="支撑单位" min-width="120" align="center"></el-table-column>
  133. <el-table-column label="操作" min-width="80" fixed="right" align="center">
  134. <template slot-scope="scope">
  135. <el-button type="text" @click="handleDetail(scope.row)">查看详情</el-button>
  136. </template>
  137. </el-table-column>
  138. </el-table>
  139. <!-- 分页 -->
  140. <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
  141. @pagination="getList" />
  142. </div>
  143. </div>
  144. </template>
  145. <script>
  146. import { getOpportunityList } from '@/api/newApi/bizoppmanage'
  147. import { get } from 'sortablejs';
  148. export default {
  149. data() {
  150. return {
  151. // 搜索表单数据
  152. searchForm: {
  153. opportunityName: '',
  154. opportunityCode: '',
  155. opportunityUnit: '',
  156. estimatedSignDate: '',
  157. indicatorTag: '',
  158. naturalCustomerName: '',
  159. opportunityOwne: '',
  160. supportPerson: '',
  161. opportunityOwner: '',
  162. supportUnit: '',
  163. contractCode: '',
  164. projectCode: '',
  165. signDate: '',
  166. approvalDate: '',
  167. opportunityStage: ''
  168. },
  169. // 搜索加载状态
  170. searchLoading: false,
  171. // 表格加载状态
  172. tableLoading: false,
  173. // 商机列表数据
  174. bizList: [],
  175. // 查询参数
  176. queryParams: {
  177. pageNum: 1,
  178. pageSize: 10
  179. },
  180. // 总条数
  181. total: 7,
  182. // 搜索区域展开状态
  183. searchExpanded: true,
  184. // 商机阶段选项
  185. opportunityStageOptions: [
  186. { value: '方案制定', label: '方案制定' },
  187. { value: '需求分析', label: '需求分析' },
  188. { value: '初步接触', label: '初步接触' },
  189. { value: '谈判中', label: '谈判中' },
  190. { value: '签约', label: '签约' },
  191. { value: '实施中', label: '实施中' }
  192. ]
  193. }
  194. },
  195. created() {
  196. this.getList();
  197. },
  198. methods: {
  199. // 搜索
  200. handleSearch() {
  201. this.queryParams.pageNum = 1;
  202. console.log('搜索条件:', this.searchForm);
  203. this.searchLoading = true;
  204. this.getList();
  205. this.searchLoading = false;
  206. },
  207. // 重置
  208. handleReset() {
  209. this.searchForm = {
  210. opportunityName: '',
  211. opportunityCode: '',
  212. opportunityUnit: '',
  213. estimatedSignDate: '',
  214. indicatorTag: '',
  215. naturalCustomerName: '',
  216. opportunityOwne: '',
  217. supportPerson: '',
  218. supportUnit: '',
  219. contractCode: '',
  220. projectCode: '',
  221. signDate: '',
  222. approvalDate: '',
  223. opportunityStage: ''
  224. };
  225. this.queryParams.pageNum = 1;
  226. this.getList();
  227. },
  228. // 展开/收起搜索
  229. toggleSearch() {
  230. this.searchExpanded = !this.searchExpanded;
  231. },
  232. // 新增商机
  233. handleAdd() {
  234. console.log('新增商机');
  235. // 这里可以添加新增逻辑
  236. },
  237. // 查看详情
  238. handleDetail(row) {
  239. this.$router.push({
  240. path: '/bizoppmanage/bizoppdetails',
  241. query: {
  242. id: row.id
  243. }
  244. });
  245. console.log('查看详情:', row);
  246. },
  247. // 获取列表数据
  248. getList() {
  249. console.log('分页参数:', this.queryParams);
  250. console.log('搜索条件:', this.searchForm);
  251. this.tableLoading = true;
  252. // 构建请求参数,合并分页参数和筛选条件
  253. const requestParams = {
  254. ...this.queryParams,
  255. opportunityName: this.searchForm.opportunityName,
  256. opportunityCode: this.searchForm.opportunityCode,
  257. opportunityStage: this.searchForm.opportunityStage,
  258. opportunityOwner: this.searchForm.opportunityOwner,
  259. supportPerson: this.searchForm.supportPerson,
  260. supportUnit: this.searchForm.supportUnit,
  261. opportunityUnit: this.searchForm.opportunityUnit,
  262. naturalCustomerName: this.searchForm.naturalCustomerName
  263. };
  264. // 处理预计签约时间范围
  265. if (this.searchForm.estimatedSignDate && this.searchForm.estimatedSignDate.length === 2) {
  266. requestParams.signTimeStart = this.searchForm.estimatedSignDate[0];
  267. requestParams.signTimeEnd = this.searchForm.estimatedSignDate[1];
  268. }
  269. getOpportunityList(requestParams).then(res => {
  270. if (res.code === 200) {
  271. this.bizList = res.rows
  272. this.total = res.total;
  273. this.tableLoading = false;
  274. }
  275. })
  276. }
  277. }
  278. }
  279. </script>
  280. <style scoped>
  281. .bizopp-manage {
  282. padding: 20px;
  283. background-color: #f5f7fa;
  284. }
  285. .search-container {
  286. background-color: #fff;
  287. padding: 20px;
  288. border-radius: 4px;
  289. box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  290. margin-bottom: 20px;
  291. }
  292. .search-form {
  293. margin-bottom: 0;
  294. }
  295. .search-form .el-form-item {
  296. margin-bottom: 15px;
  297. }
  298. .date-row .el-form-item {
  299. margin-bottom: 20px;
  300. }
  301. .date-row .el-col {
  302. min-width: 280px;
  303. }
  304. .list-container {
  305. background-color: #fff;
  306. padding: 20px;
  307. border-radius: 4px;
  308. box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  309. }
  310. .list-header {
  311. margin-bottom: 20px;
  312. }
  313. .pagination-container {
  314. margin-top: 20px;
  315. text-align: right;
  316. }
  317. </style>