ad-countdata.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. <template>
  2. <div class="page-wrap page-wrap-put-books">
  3. <tool-bar
  4. :text="['advertiser_id']"
  5. :label="['账户信息']"
  6. :placeholder="['请输入账户名称或ID']"
  7. v-model:loading="inSearching"
  8. @confirm="onSearch"
  9. >
  10. <template #picker>
  11. <p class="label">日期</p>
  12. <a-range-picker
  13. v-model:value="pickered"
  14. :ranges="rangePick"
  15. format="YYYY/MM/DD"
  16. @change="changeTime"
  17. />
  18. </template>
  19. <template v-if="!!is_admin">
  20. <div class="tool-bar-item">
  21. <p class="label">推广员</p>
  22. <a-select
  23. mode="multiple"
  24. v-model:value="uids"
  25. placeholder="请选择推广员"
  26. style="width: 300px"
  27. >
  28. <a-select-option
  29. v-for="user in available_uids"
  30. :key="user.id"
  31. :value="user.id"
  32. >
  33. {{ user.nickname }}
  34. </a-select-option>
  35. </a-select>
  36. </div>
  37. </template>
  38. </tool-bar>
  39. <template v-if="showTable">
  40. <a-table
  41. :columns="columns"
  42. :data-source="list"
  43. :pagination="tablePageOptions"
  44. bordered
  45. :loading="tableLoading"
  46. :scroll="{ y: scrollY, x: 1200 }"
  47. size="small"
  48. @change="handleTableChange"
  49. rowKey="id"
  50. >
  51. <template #info="{ record }">
  52. <p
  53. @click="goAdlgroup(record.advertiser_id)"
  54. class="small-font single-line"
  55. >
  56. <a href="javascript:;">{{ record.advertiser_name }}</a>
  57. </p>
  58. <p
  59. @click="goAdlgroup(record.advertiser_id)"
  60. class="small-font single-line"
  61. >
  62. <a style="color: rgb(160, 160, 160)" href="javascript:;"
  63. >ID:{{ record.advertiser_id }}</a
  64. >
  65. </p>
  66. </template>
  67. <template #budget="{ record }">
  68. <editable-cell
  69. :text="
  70. record.budget_mode == 'BUDGET_MODE_INFINITE'
  71. ? '不限'
  72. : record.budget
  73. "
  74. title="预算"
  75. :minValue="1000"
  76. :muliteType="true"
  77. customTitle="不限"
  78. customValue="不限"
  79. @change="(val) => onCellChange(record, 'budget', val)"
  80. />
  81. </template>
  82. <template #operte="{ text, record }">
  83. <editable-cell
  84. :text="`${text}`"
  85. :minValue="0"
  86. title="回传最小金额设置"
  87. @change="(val) => onCellChange(record, 'min_amout', val)"
  88. />
  89. </template>
  90. </a-table>
  91. </template>
  92. </div>
  93. </template>
  94. <script lang="ts">
  95. import {
  96. defineComponent,
  97. reactive,
  98. toRefs,
  99. ref,
  100. onMounted,
  101. computed,
  102. } from "vue";
  103. import { picker } from "@/helper/config/range";
  104. import ToolBar from "@/components/tool-bar/index.vue";
  105. import moment from "moment";
  106. import useApp from "@/hooks/useApp";
  107. import { MutationType } from "@/store/modules/app/_type";
  108. import { AdCoundCloumn } from "../_pageOptions/table-put";
  109. import {
  110. getAdgroupData,
  111. setGroupStatus,
  112. setGroupDay,
  113. ALLAcountGroupData,
  114. setBackMinimum,
  115. } from "@/api";
  116. import usePagination from "@/hooks/usePagination";
  117. import EditableCell from "@/components/edit-cell/index.vue";
  118. import { AdgroupList, PageOptions } from "#/api";
  119. import useAuthUser from "@/hooks/composable/useAuthUser";
  120. const Adgroup = defineComponent({
  121. components: {
  122. ToolBar,
  123. EditableCell,
  124. },
  125. setup() {
  126. let { loading, meta, tablePageOptions } = usePagination();
  127. const { is_admin, available_uids } = useAuthUser();
  128. const { router, store } = useApp();
  129. console.log(moment(store.getters.selectTime[0]));
  130. const state = reactive({
  131. inSearching: false,
  132. open: false,
  133. inConfirm: false,
  134. list: ref<AdgroupList[]>([]),
  135. rangePick: picker,
  136. pickered: computed(() =>
  137. store.getters.selectTime.length > 0
  138. ? [
  139. moment(store.getters.selectTime[0]),
  140. moment(store.getters.selectTime[1]),
  141. ]
  142. : [moment().subtract(30, "d"), moment()]
  143. ),
  144. columns: ref<any[]>([]),
  145. uids: ref<number[]>([]),
  146. fields: {},
  147. tableLoading: false,
  148. cost_order: 0,
  149. convert_order: 0,
  150. convert_cost_order: 0,
  151. balance_order: 0,
  152. showTable: false,
  153. scrollY: 600,
  154. });
  155. const onSearch = (fields: Record<string, string>) => {
  156. const { advertiser_id, account_id } = fields;
  157. state.fields = fields;
  158. getData({ current: 1, advertiser_id, account_id });
  159. };
  160. const getData = async (query?: {
  161. current: number;
  162. advertiser_id?: string;
  163. account_id?: string;
  164. }) => {
  165. try {
  166. state.tableLoading = true;
  167. loading.value = true;
  168. let [begin_dates, end_dates] = state.pickered;
  169. let begin_date, end_date;
  170. if (begin_dates && end_dates) {
  171. begin_date = moment(begin_dates).format("YYYY-MM-DD");
  172. end_date = moment(end_dates).format("YYYY-MM-DD");
  173. }
  174. let datas = Object.assign(
  175. {
  176. begin_date,
  177. end_date,
  178. advertiser_id: query?.advertiser_id,
  179. account_id: query?.account_id,
  180. page: query?.current ?? 1,
  181. },
  182. {
  183. cost_order: state.cost_order,
  184. convert_order: state.convert_order,
  185. convert_cost_order: state.convert_cost_order,
  186. balance_order: state.balance_order,
  187. uids: state.uids.toString(),
  188. }
  189. );
  190. const { data } = await getAdgroupData(datas);
  191. const { data: totals } = await ALLAcountGroupData(datas);
  192. let sortList = ["cost", "convert", "convert_cost", "balance"];
  193. let mainCloumn = AdCoundCloumn.map((r) => {
  194. if (
  195. r.dataIndex != "firle" &&
  196. r.dataIndex !== "campaign_name" &&
  197. r.dataIndex !== "back_min_price"
  198. ) {
  199. r.children = [
  200. {
  201. title: totals[r.dataIndex],
  202. dataIndex: r.dataIndex,
  203. width: r.width,
  204. ellipsis: true,
  205. sorter: sortList.includes(r.dataIndex) ? true : false,
  206. sortDirections: ["descend", "ascend", false],
  207. },
  208. ];
  209. }
  210. return r;
  211. });
  212. state.columns = mainCloumn;
  213. state.list = data.list;
  214. meta.value = data.meta;
  215. } catch (error) {
  216. console.log("on get books list error");
  217. } finally {
  218. state.inSearching = false;
  219. state.tableLoading = false;
  220. }
  221. };
  222. const setSateSwitch = (val: string, name: string) => {
  223. state.cost_order = 0;
  224. state.convert_order = 0;
  225. state.convert_cost_order = 0;
  226. state.balance_order = 0;
  227. switch (val) {
  228. case "ascend":
  229. (state as any)[name] = 2;
  230. break;
  231. case "descend":
  232. (state as any)[name] = 1;
  233. break;
  234. default:
  235. (state as any)[name] = 0;
  236. }
  237. };
  238. const handleTableChange = (
  239. pagination: PageOptions,
  240. filters: any,
  241. sorter: any
  242. ) => {
  243. console.log(sorter.columnKey);
  244. if (sorter.columnKey == "cost") {
  245. setSateSwitch(sorter.order, "cost_order");
  246. }
  247. if (sorter.columnKey == "balance") {
  248. setSateSwitch(sorter.order, "balance_order");
  249. }
  250. if (sorter.columnKey == "convert") {
  251. setSateSwitch(sorter.order, "convert_order");
  252. }
  253. if (sorter.columnKey == "convert_cost") {
  254. setSateSwitch(sorter.order, "convert_cost_order");
  255. }
  256. const { current, pageSize, total } = pagination;
  257. let data = Object.assign({ current, ...state.fields });
  258. getData(data);
  259. };
  260. const goAdlgroup = (id: string) => {
  261. router.push({ path: "/put/datas/group", query: { advertiser_id: id } });
  262. };
  263. const changeTime = (monent: any, string: string[]) => {
  264. if (Array.isArray(string) && string.join("")) {
  265. store.commit(MutationType.setSelectTime, string);
  266. }
  267. };
  268. onMounted(getData);
  269. return {
  270. ...toRefs(state),
  271. is_admin,
  272. available_uids,
  273. loading,
  274. tablePageOptions,
  275. onSearch,
  276. handleTableChange,
  277. goAdlgroup,
  278. changeTime,
  279. };
  280. },
  281. mounted() {
  282. let winHeight =
  283. document.documentElement.clientHeight || document.body.clientHeight;
  284. this.scrollY = winHeight - 237;
  285. this.showTable = true;
  286. },
  287. methods: {
  288. moment,
  289. onCellChange(record: any, dataIndex: string, value: string) {
  290. if (dataIndex === "budget") {
  291. let data = {
  292. advertiser_id: record.advertiser_id,
  293. budget_mode:
  294. value == "不限" ? "BUDGET_MODE_INFINITE" : "BUDGET_MODE_DAY",
  295. budget: value == "不限" ? "0" : Number(value),
  296. };
  297. setGroupDay(data).then((res) => {
  298. this.$message.success("修改成功!");
  299. });
  300. } else {
  301. let data = {
  302. advertiser_id: record.advertiser_id,
  303. back_min_price: value,
  304. };
  305. setBackMinimum(data).then((res) => {
  306. this.$message.success("修改成功!");
  307. });
  308. }
  309. },
  310. },
  311. });
  312. export default Adgroup;
  313. </script>