Commit a1a27ca103580b39445e3953c246c42805951121
1 parent
1830f667
app快速报价
Showing
33 changed files
with
621 additions
and
17 deletions
src/assets/mobile/6.png
0 → 100644
3.67 KB
src/assets/mobile/61.png
0 → 100644
3.64 KB
src/components/QuickQuote/index.jsx
| ... | ... | @@ -1187,9 +1187,11 @@ const ContentComponent = props => { |
| 1187 | 1187 | // 主表组件 |
| 1188 | 1188 | const MasterComponent = props => { |
| 1189 | 1189 | const { masterConfig, masterData = {}, selectedNode = {} } = props.state; |
| 1190 | + console.log("🚀 ~ masterConfig:", masterConfig) | |
| 1190 | 1191 | if (!masterConfig) return ""; |
| 1191 | 1192 | |
| 1192 | 1193 | const ableConfigs = masterConfig.gdsconfigformslave.filter(item => item.sName && item.bVisible); |
| 1194 | + console.log("🚀 ~ ableConfigs:", ableConfigs) | |
| 1193 | 1195 | // 处理长宽样式 |
| 1194 | 1196 | const viewConfigs = selectedNode?.bBox ? ableConfigs : ableConfigs.filter(x => x.sName !== "dHeight"); |
| 1195 | 1197 | if (selectedNode?.bBox) { | ... | ... |
src/mobile/components/SelectInput.jsx
0 → 100644
| 1 | +import React, { useState, useRef, useEffect, useCallback } from "react"; | |
| 2 | +import { Input, Popup, Button, Toast, PickerView, SearchBar } from "antd-mobile"; | |
| 3 | +import { DownOutline } from "antd-mobile-icons"; | |
| 4 | +import commonConfig from "@/utils/config"; | |
| 5 | +import * as commonServices from "@/services/services"; | |
| 6 | +import * as commonFunc from "@/components/Common/commonFunc"; | |
| 7 | +import styles from "./selectInput.less"; | |
| 8 | +import debounce from "lodash/debounce"; | |
| 9 | + | |
| 10 | + | |
| 11 | +const SelectInput = (props) => { | |
| 12 | + console.log(props, "SelectInput props"); | |
| 13 | + | |
| 14 | + const [value, setValue] = useState(""); | |
| 15 | + const [values, setValues] = useState(""); | |
| 16 | + const [searchValue, setSearchValue] = useState(""); | |
| 17 | + const [visible, setVisible] = useState(false); | |
| 18 | + useEffect(() => { | |
| 19 | + // 监听滚动事件 | |
| 20 | + // const data = getSqlDropDownData() | |
| 21 | + // console.log(data, "data"); | |
| 22 | + | |
| 23 | + }, [visible]); | |
| 24 | + const [columns, setColumns] = useState([ | |
| 25 | + { label: "选项1", value: "option1" }, | |
| 26 | + { label: "选项2", value: "option2" }, | |
| 27 | + { label: "选项3", value: "option3" }, | |
| 28 | + ]); | |
| 29 | + const [coplyColumns, setCopyColumns] = useState(columns); | |
| 30 | + // | |
| 31 | + const [hasMore, setHasMore] = useState(true); | |
| 32 | + const [loading, setLoading] = useState(false); | |
| 33 | + | |
| 34 | + const handleConfirm = () => { | |
| 35 | + console.log(values, "values"); | |
| 36 | + setValue(values); | |
| 37 | + setVisible(false); | |
| 38 | + }; | |
| 39 | + | |
| 40 | + const handleCancel = () => { | |
| 41 | + Toast.show("取消按钮被点击"); | |
| 42 | + setVisible(false); | |
| 43 | + }; | |
| 44 | + const changeInputValue = val => { | |
| 45 | + console.log(val, "val"); | |
| 46 | + }; | |
| 47 | + | |
| 48 | + const searchData = val => { | |
| 49 | + // todo调用接口 | |
| 50 | + setSearchValue(val); | |
| 51 | + const list = columns.filter(item => item.label.includes(val)); | |
| 52 | + setColumns(list); | |
| 53 | + if (val === "") { | |
| 54 | + console.log(36666); | |
| 55 | + setColumns(coplyColumns); | |
| 56 | + } | |
| 57 | + }; | |
| 58 | + // 处理选择器变化 | |
| 59 | + const changeOption = val => { | |
| 60 | + setValues(val[0]); | |
| 61 | + }; | |
| 62 | + | |
| 63 | + const getSqlDropDownData = async ({ sId, sModelsId, sName }) => { | |
| 64 | + const url = `${commonConfig.server_host}business/getSelectLimit/${sId}?sModelsId=${sModelsId}&sName=${sName}`; | |
| 65 | + const body = { | |
| 66 | + sSqlCondition: "", | |
| 67 | + sKeyUpFilterName: "", | |
| 68 | + pageNum: 1, | |
| 69 | + pageSize: 20, | |
| 70 | + }; | |
| 71 | + const retrunData = await commonServices.postValueService(props.app.token, body, url); | |
| 72 | + const sColumnNameConfigStr = retrunData.data?.dataset?.rows?.[0]?.sColumnNameConfig; | |
| 73 | + return commonUtils.convertStrToObj(sColumnNameConfigStr, []); | |
| 74 | + }; | |
| 75 | + return ( | |
| 76 | + <div> | |
| 77 | + <div className={styles.inputBox}> | |
| 78 | + <Input | |
| 79 | + placeholder="" | |
| 80 | + value={value} | |
| 81 | + onChange={val => { | |
| 82 | + setValue(val); | |
| 83 | + }} | |
| 84 | + /> | |
| 85 | + <div className={styles.icons} onClick={() => setVisible(true)}> | |
| 86 | + <DownOutline /> | |
| 87 | + </div> | |
| 88 | + </div> | |
| 89 | + <Popup visible={visible} onMaskClick={() => setVisible(false)} onClose={() => setVisible(false)} bodyStyle={{ height: "50vh" }}> | |
| 90 | + <div className={styles.popupHeader}> | |
| 91 | + <Button onClick={handleCancel} color="primary" fill="none"> | |
| 92 | + 取消 | |
| 93 | + </Button> | |
| 94 | + <Button onClick={handleConfirm} color="primary" fill="none"> | |
| 95 | + 确认 | |
| 96 | + </Button> | |
| 97 | + </div> | |
| 98 | + <div style={{ padding: "0 1.5rem", marginTop: "1rem" }}> | |
| 99 | + <SearchBar placeholder="请输入内容" showCancelButton value={searchValue} onChange={val => searchData(val)} /> | |
| 100 | + </div> | |
| 101 | + <PickerView | |
| 102 | + columns={[columns]} | |
| 103 | + value={values} | |
| 104 | + onChange={val => changeOption(val)} | |
| 105 | + style={{ "--height": "200px", "--item-height": "2.8rem" }} | |
| 106 | + /> | |
| 107 | + </Popup> | |
| 108 | + </div> | |
| 109 | + ); | |
| 110 | +}; | |
| 111 | + | |
| 112 | +export default SelectInput; | ... | ... |
src/mobile/components/selectInput.css
0 → 100644
| 1 | +.inputBox { | |
| 2 | + position: relative; | |
| 3 | +} | |
| 4 | +.inputBox .icons { | |
| 5 | + position: absolute; | |
| 6 | + top: 50%; | |
| 7 | + right: 0rem; | |
| 8 | + transform: translateY(-50%); | |
| 9 | + width: 3.125rem; | |
| 10 | + height: 3.125rem; | |
| 11 | + line-height: 3.125rem; | |
| 12 | + text-align: center; | |
| 13 | +} | |
| 14 | +.inputBox .pickerWrapper { | |
| 15 | + flex: 1; | |
| 16 | + overflow-y: auto; | |
| 17 | + -webkit-overflow-scrolling: touch; | |
| 18 | +} | |
| 19 | +.popupHeader { | |
| 20 | + display: flex; | |
| 21 | + align-items: center; | |
| 22 | + justify-content: space-between; | |
| 23 | + margin: 0.2rem; | |
| 24 | +} | ... | ... |
src/mobile/components/selectInput.less
0 → 100644
| 1 | +.inputBox { | |
| 2 | + position: relative; | |
| 3 | + .icons { | |
| 4 | + position: absolute; | |
| 5 | + top: 50%; | |
| 6 | + right: 0rem; | |
| 7 | + transform: translateY(-50%); | |
| 8 | + width: 3.125rem; | |
| 9 | + height: 3.125rem; | |
| 10 | + line-height: 3.125rem; | |
| 11 | + text-align: center; | |
| 12 | + } | |
| 13 | + .pickerWrapper { | |
| 14 | + flex: 1; | |
| 15 | + overflow-y: auto; | |
| 16 | + -webkit-overflow-scrolling: touch; | |
| 17 | + } | |
| 18 | +} | |
| 19 | +.popupHeader{ | |
| 20 | + display: flex; | |
| 21 | + align-items: center; | |
| 22 | + justify-content: space-between; | |
| 23 | + margin: 0.2rem; | |
| 24 | +} | |
| 0 | 25 | \ No newline at end of file | ... | ... |
src/mobile/components/showType.jsx
0 → 100644
| 1 | +import React, { useState } from "react"; | |
| 2 | +import { history } from "umi"; | |
| 3 | +import { Tabs } from "antd-mobile"; | |
| 4 | +import commonConfig from "@/utils/config"; | |
| 5 | +import * as commonServices from "@/services/services"; | |
| 6 | +import * as commonFunc from "@/components/Common/commonFunc"; | |
| 7 | +import { useEffect } from "react"; | |
| 8 | +import styles from "./showType.less"; | |
| 9 | +const showType = props => { | |
| 10 | + // const {state} = props.location | |
| 11 | + | |
| 12 | + // console.log(JSON.parse(state), "QuotationAllprogressDetail"); | |
| 13 | + console.log(props, "QuotationAllprogressDetail props"); | |
| 14 | + | |
| 15 | + return ( | |
| 16 | + <div className={styles.quotationDetailBox}> | |
| 17 | + 66666 | |
| 18 | + </div> | |
| 19 | + ); | |
| 20 | +}; | |
| 21 | + | |
| 22 | + | |
| 23 | +export default showType; | ... | ... |
src/mobile/components/showType.less
0 → 100644
src/mobile/quotation/detail.jsx
0 → 100644
| 1 | +import React, { useState } from "react"; | |
| 2 | +import { history } from "umi"; | |
| 3 | +import { Tabs } from "antd-mobile"; | |
| 4 | +import commonConfig from "@/utils/config"; | |
| 5 | +import * as commonServices from "@/services/services"; | |
| 6 | +import * as commonFunc from "@/components/Common/commonFunc"; | |
| 7 | +import { useEffect } from "react"; | |
| 8 | +import styles from "./quotationDetail.less"; | |
| 9 | +import SelectInput from "../components/SelectInput"; | |
| 10 | +const QuotationAllprogressDetail = props => { | |
| 11 | + // const {state} = props.location | |
| 12 | + | |
| 13 | + // console.log(JSON.parse(state), "QuotationAllprogressDetail"); | |
| 14 | + console.log(props, "QuotationAllprogressDetail props"); | |
| 15 | + | |
| 16 | + return ( | |
| 17 | + <div className={styles.quotationDetailBox}> | |
| 18 | + <QuotationDetail {...props} /> | |
| 19 | + </div> | |
| 20 | + ); | |
| 21 | +}; | |
| 22 | + | |
| 23 | +const QuotationDetail = props => { | |
| 24 | + const { location, app } = props; | |
| 25 | + const { token } = app; | |
| 26 | + const [state, setState] = useState(null); | |
| 27 | + | |
| 28 | + // 初始化状态 | |
| 29 | + const { formData = [] } = state || {}; | |
| 30 | + const { quotationData } = JSON.parse(location.state) || {}; | |
| 31 | + const [masterConfig, setMasterConfig] = useState(null); | |
| 32 | + useEffect(() => { | |
| 33 | + // 安全地解析 state | |
| 34 | + let parsedState = {}; | |
| 35 | + try { | |
| 36 | + parsedState = JSON.parse(location.state || "{}"); | |
| 37 | + } catch (error) { | |
| 38 | + console.error("Error parsing state:", error); | |
| 39 | + } | |
| 40 | + const { sModelsId } = parsedState; | |
| 41 | + // 构造请求 URL | |
| 42 | + const configUrl = `${commonConfig.server_host}business/getModelBysId/${"172129113112117428019179600"}?sModelsId=${"172129113112117428019179600"}`; | |
| 43 | + // 调用服务获取数据 | |
| 44 | + commonServices | |
| 45 | + .getService(token, configUrl) | |
| 46 | + .then(({ data: configReturn }) => { | |
| 47 | + if (configReturn.code === 1) { | |
| 48 | + const formData = configReturn.dataset.rows[0]?.formData; | |
| 49 | + setMasterConfig(formData[0]); | |
| 50 | + setState(pre => ({ ...pre, formData })); | |
| 51 | + } | |
| 52 | + }) | |
| 53 | + .catch(error => { | |
| 54 | + console.error("Error fetching data:", error); | |
| 55 | + }); | |
| 56 | + }, [location, app]); | |
| 57 | + | |
| 58 | + // 主表 | |
| 59 | + const list = masterConfig?.gdsconfigformslave.filter(item => item.sName && item.bVisible); | |
| 60 | + console.log("🚀 ~ list:", list); | |
| 61 | + // 客户 | |
| 62 | + const customer = list?.find(x => x.showName === "客户名称") || {}; | |
| 63 | + // console.log("🚀 ~ ableConfigs:", masterConfig); | |
| 64 | + console.log("🚀 ~ customer:", customer); | |
| 65 | + return ( | |
| 66 | + <div> | |
| 67 | + <div>{quotationData?.showName || "Loading..."}</div> | |
| 68 | + {/* {list&& list.length | |
| 69 | + ? list.map((item, index) => { | |
| 70 | + return ( | |
| 71 | + <div key={index} className={styles.customer}> | |
| 72 | + <div className={styles.quotationDetailTitle}>{item.showName}</div> | |
| 73 | + <SelectInput {...props} detailData={item}/> | |
| 74 | + </div> | |
| 75 | + ); | |
| 76 | + }) | |
| 77 | + : ""} */} | |
| 78 | + <div className={styles.customer}> | |
| 79 | + <div>客户名称</div> | |
| 80 | + <SelectInput {...props} /> | |
| 81 | + </div> | |
| 82 | + </div> | |
| 83 | + ); | |
| 84 | +}; | |
| 85 | + | |
| 86 | +export default QuotationAllprogressDetail; | ... | ... |
src/mobile/quotation/index.css
0 → 100644
| 1 | +.quotationBox { | |
| 2 | + width: 100%; | |
| 3 | + height: 100%; | |
| 4 | + position: relative; | |
| 5 | + display: flex; | |
| 6 | + align-items: center; | |
| 7 | + justify-content: center; | |
| 8 | +} | |
| 9 | +.quotationBox .quotationNavigation { | |
| 10 | + width: 30%; | |
| 11 | + height: 100%; | |
| 12 | +} | |
| 13 | +.quotationBox .quotationNavigation :global .adm-side-bar { | |
| 14 | + background-color: #EBF2FD; | |
| 15 | +} | |
| 16 | +.quotationBox .quotationContent { | |
| 17 | + width: 70%; | |
| 18 | + height: 100%; | |
| 19 | +} | |
| 20 | +.quotationBox .quotationContent .contentItem { | |
| 21 | + width: 92%; | |
| 22 | + height: 7.5rem; | |
| 23 | + border-radius: 10px; | |
| 24 | + background-color: #fff; | |
| 25 | + margin: 0 auto; | |
| 26 | + margin-bottom: 1rem; | |
| 27 | + display: flex; | |
| 28 | + padding: 0.625rem; | |
| 29 | +} | |
| 30 | +.quotationBox .quotationContent .contentItem .contentItemImg { | |
| 31 | + width: 6rem; | |
| 32 | + height: 6rem; | |
| 33 | + border-radius: 10px; | |
| 34 | +} | |
| 35 | +.quotationBox .quotationContent .contentItem .contentItemTitle { | |
| 36 | + font-size: 1.1rem; | |
| 37 | + color: #333; | |
| 38 | + margin-left: 0.625rem; | |
| 39 | + font-weight: 700; | |
| 40 | +} | ... | ... |
src/mobile/quotation/index.jsx
0 → 100644
| 1 | +import React, { useEffect, useState } from "react"; | |
| 2 | +import { history } from "umi"; | |
| 3 | +import { SideBar } from "antd-mobile"; | |
| 4 | +import styles from "./index.less"; | |
| 5 | +import Icon5 from "@/assets/mobile/20.png"; | |
| 6 | +import commonConfig from "@/utils/config"; | |
| 7 | +import * as commonServices from "@/services/services"; | |
| 8 | +import quotation from "@/routes/mobile/quotation"; | |
| 9 | +const QuotationAllprogress = baseProps => { | |
| 10 | + const { sModelsId } = baseProps; | |
| 11 | + const { token } = baseProps.app; | |
| 12 | + const [state, setState] = useState(null); | |
| 13 | + const [selectedKey, setSelectedKey] = useState(null); | |
| 14 | + const { treeDataList } = baseProps.state || {}; | |
| 15 | + const getQuotationList = async () => { | |
| 16 | + const configDataId = "172129113112117428019180410"; | |
| 17 | + const formSrcRoute = ""; | |
| 18 | + const condition = { | |
| 19 | + bFilter: [], | |
| 20 | + pageNum: 1, | |
| 21 | + pageSize: 1000, | |
| 22 | + }; | |
| 23 | + const dataUrl = `${commonConfig.server_host}filterTree/getFilterTree/${configDataId}?sModelsId=${sModelsId}&sName=${formSrcRoute}`; | |
| 24 | + const dataReturn = (await commonServices.postValueService(token, condition, dataUrl)).data; | |
| 25 | + const treeDataList = dataReturn.dataset.rows[0].children.map(item => { | |
| 26 | + return item; | |
| 27 | + }); | |
| 28 | + setState(pre => ({ ...pre, treeDataList })); | |
| 29 | + // setSelectedKey(treeDataList[0].sId); // 默认选中第一条 | |
| 30 | + }; | |
| 31 | + // 172129113112117428019180410 | |
| 32 | + useEffect(() => { | |
| 33 | + getQuotationList(); | |
| 34 | + }, [sModelsId]); | |
| 35 | + const treeProps = { | |
| 36 | + ...baseProps, | |
| 37 | + state, | |
| 38 | + selectedKey, | |
| 39 | + setState, | |
| 40 | + }; | |
| 41 | + return ( | |
| 42 | + <div className={styles.quotationBox}> | |
| 43 | + <div className={styles.quotationNavigation}> | |
| 44 | + <TreeComponent {...treeProps} /> | |
| 45 | + </div> | |
| 46 | + <div className={styles.quotationContent}> | |
| 47 | + <ContentComponent {...treeProps} /> | |
| 48 | + </div> | |
| 49 | + </div> | |
| 50 | + ); | |
| 51 | +}; | |
| 52 | +// 侧边导航 | |
| 53 | +const TreeComponent = props => { | |
| 54 | + const { treeDataList, selectedKey } = props.state || {}; | |
| 55 | + const { setState } = props; | |
| 56 | + useEffect(() => { | |
| 57 | + if (treeDataList && treeDataList.length) { | |
| 58 | + const list = treeDataList.find(item => item.sId === treeDataList[0].sId); | |
| 59 | + if (list && list.children && list.children.length) { | |
| 60 | + // 如果有子节点,则取子节点的名称 | |
| 61 | + setState(pre => ({ | |
| 62 | + ...pre, | |
| 63 | + selectedKey: treeDataList[0].sId, | |
| 64 | + contentList: list.children.map(child => { | |
| 65 | + return child; | |
| 66 | + }), | |
| 67 | + })); | |
| 68 | + } | |
| 69 | + } | |
| 70 | + }, [treeDataList]); | |
| 71 | + return treeDataList && treeDataList.length ? ( | |
| 72 | + <SideBar | |
| 73 | + selectedKeys={[selectedKey]} // 设置默认选中项 | |
| 74 | + onChange={key => { | |
| 75 | + const list = treeDataList.find(item => item.sId === key); | |
| 76 | + if (list && list.children && list.children.length) { | |
| 77 | + // 如果有子节点,则取子节点的名称 | |
| 78 | + setState(pre => ({ | |
| 79 | + ...pre, | |
| 80 | + selectedKey: key, | |
| 81 | + contentList: list.children.map(child => { | |
| 82 | + return child; | |
| 83 | + }), | |
| 84 | + })); | |
| 85 | + } | |
| 86 | + }} | |
| 87 | + > | |
| 88 | + {treeDataList && treeDataList.length | |
| 89 | + ? treeDataList.map(item => <SideBar.Item key={item.sId} title={item.showName} style={{ background: "#EBF2FD" }} />) | |
| 90 | + : ""} | |
| 91 | + </SideBar> | |
| 92 | + ) : ( | |
| 93 | + "" | |
| 94 | + ); | |
| 95 | +}; | |
| 96 | +// 内容 | |
| 97 | +const ContentComponent = props => { | |
| 98 | + const { contentList = [] } = props.state || {}; | |
| 99 | + // 路由 | |
| 100 | + const handleGridClick = item => () => { | |
| 101 | + console.log(item, props, "handleGridClick"); | |
| 102 | + console.log(props.dispatch, "handleGridClick"); | |
| 103 | + | |
| 104 | + props.dispatch({ | |
| 105 | + type: "content/onRouterMobile", | |
| 106 | + payload: { | |
| 107 | + url: "/indexMobile/quotationDetail" /* 接口地址 */, | |
| 108 | + urlKey: undefined, | |
| 109 | + sModelsId: props.sModelsId, | |
| 110 | + sModelType: props.sModelType, | |
| 111 | + quotationData: item | |
| 112 | + }, | |
| 113 | + }); | |
| 114 | + }; | |
| 115 | + return ( | |
| 116 | + <div className={styles.content}> | |
| 117 | + {contentList.map(item => ( | |
| 118 | + <div key={item.key} className={styles.contentItem} onClick={handleGridClick(item)}> | |
| 119 | + <img src={Icon5} alt="" className={styles.contentItemImg} /> | |
| 120 | + <span className={styles.contentItemTitle}>{item.showName}</span> | |
| 121 | + </div> | |
| 122 | + ))} | |
| 123 | + </div> | |
| 124 | + ); | |
| 125 | +}; | |
| 126 | +export default QuotationAllprogress; | ... | ... |
src/mobile/quotation/index.less
0 → 100644
| 1 | + | |
| 2 | +.quotationBox { | |
| 3 | + width: 100%; | |
| 4 | + height: 100%; | |
| 5 | + position: relative; | |
| 6 | + display: flex; | |
| 7 | + align-items: center; | |
| 8 | + justify-content: center; | |
| 9 | + .quotationNavigation { | |
| 10 | + width: 30%; | |
| 11 | + height: 100%; | |
| 12 | + :global .adm-side-bar { | |
| 13 | + background-color: #EBF2FD; | |
| 14 | + } | |
| 15 | + } | |
| 16 | + .quotationContent { | |
| 17 | + width: 70%; | |
| 18 | + height: 100%; | |
| 19 | + .contentItem { | |
| 20 | + width: 92%; | |
| 21 | + height: 7.5rem; | |
| 22 | + border-radius: 10px; | |
| 23 | + background-color: #fff; | |
| 24 | + margin: 0 auto; | |
| 25 | + margin-bottom: 1rem; | |
| 26 | + display: flex; | |
| 27 | + padding: 0.625rem; | |
| 28 | + .contentItemImg { | |
| 29 | + width: 6rem; | |
| 30 | + height: 6rem; | |
| 31 | + border-radius: 10px; | |
| 32 | + } | |
| 33 | + .contentItemTitle { | |
| 34 | + font-size: 1.1rem; | |
| 35 | + color: #333; | |
| 36 | + margin-left: 0.625rem; | |
| 37 | + font-weight: 700; | |
| 38 | + } | |
| 39 | + } | |
| 40 | + } | |
| 41 | +} | ... | ... |
src/mobile/quotation/quotationDetail.css
0 → 100644
src/mobile/quotation/quotationDetail.less
0 → 100644
| 1 | +.quotationDetailBox{ | |
| 2 | + padding: 1rem; | |
| 3 | + // height: 100%; | |
| 4 | + background-color: #fff; | |
| 5 | + // height: 100vh; | |
| 6 | +} | |
| 7 | +.customer{ | |
| 8 | + margin-top: 2rem; | |
| 9 | + :global .adm-input-element{ | |
| 10 | + border: 1px solid #DEDEDF; | |
| 11 | + height: 3.125rem; | |
| 12 | + margin: 0.5rem 0; | |
| 13 | + border-radius: 5px; | |
| 14 | + } | |
| 15 | +} | |
| 0 | 16 | \ No newline at end of file | ... | ... |
src/models/content.js
| ... | ... | @@ -94,6 +94,8 @@ export default { |
| 94 | 94 | |
| 95 | 95 | *onRouterMobile({ payload }, { put, call, select }) { |
| 96 | 96 | const { urlKey } = payload; /* 参数接收 */ |
| 97 | + console.log(payload,'payload'); | |
| 98 | + | |
| 97 | 99 | if (urlKey !== undefined) { |
| 98 | 100 | const token = yield select(state => state.app.token); /* 用户令牌 */ |
| 99 | 101 | const { data } = yield call(services.getService, token, urlKey); |
| ... | ... | @@ -126,11 +128,13 @@ export default { |
| 126 | 128 | yield put({ type: 'app/throwErrorMobile', payload: data }); |
| 127 | 129 | } |
| 128 | 130 | } else { |
| 131 | + | |
| 129 | 132 | const param = { |
| 130 | 133 | sModelsId: payload.sModelsId, |
| 131 | 134 | sId: payload.sId, |
| 132 | 135 | personPic: payload.personPic, |
| 133 | 136 | slaveData: payload.slaveData, |
| 137 | + quotationData: payload.quotationData, | |
| 134 | 138 | }; |
| 135 | 139 | history.push(payload.url, commonUtils.convertObjToStr(param)); |
| 136 | 140 | // yield put(routerRedux.push({ | ... | ... |
src/routes/mobile/IndexMobile.js
| ... | ... | @@ -28,6 +28,10 @@ import Icon31 from "../../assets/mobile/31.png"; |
| 28 | 28 | // import Icon41 from '../../assets/mobile/41.png'; |
| 29 | 29 | import Icon5 from "../../assets/mobile/5.png"; |
| 30 | 30 | import Icon51 from "../../assets/mobile/51.png"; |
| 31 | +import Icon6 from "../../assets/mobile/6.png"; | |
| 32 | +import Icon61 from "../../assets/mobile/61.png"; | |
| 33 | +import Quotation from "./quotation/index"; | |
| 34 | +import QuotationDetail from "./quotation/detail"; | |
| 31 | 35 | // import AppUtil from '../../utils/AppUtil'; |
| 32 | 36 | import * as commonBusiness from "../../components/Common/commonBusiness"; |
| 33 | 37 | |
| ... | ... | @@ -48,8 +52,6 @@ class IndexMobile extends React.Component { |
| 48 | 52 | } |
| 49 | 53 | componentWillMount() { |
| 50 | 54 | history.push("/indexMobile"); // 刷新时更新路由,避免底部按钮和返回按钮错乱显示 |
| 51 | - console.log("🚀 ~ IndexMobile ~ componentWillMount ~ this.props:", this.props) | |
| 52 | - | |
| 53 | 55 | if (this.props.routing && this.props.routing) { |
| 54 | 56 | const { state } = this.props.routing; |
| 55 | 57 | if (state) { |
| ... | ... | @@ -72,6 +74,7 @@ class IndexMobile extends React.Component { |
| 72 | 74 | scene: "现场", |
| 73 | 75 | workbench: "工作台", |
| 74 | 76 | device: "设备", |
| 77 | + quotation: "报价下单", | |
| 75 | 78 | myself: "我的", |
| 76 | 79 | }[this.state.selectedTab]; |
| 77 | 80 | |
| ... | ... | @@ -113,6 +116,8 @@ class IndexMobile extends React.Component { |
| 113 | 116 | } |
| 114 | 117 | }; |
| 115 | 118 | renderContent(pageText) { |
| 119 | + console.log(this.props, "pageText"); | |
| 120 | + | |
| 116 | 121 | if (pageText === "message") { |
| 117 | 122 | if (location.pathname === "/indexMobile/examine") { |
| 118 | 123 | return ( |
| ... | ... | @@ -208,6 +213,19 @@ class IndexMobile extends React.Component { |
| 208 | 213 | </div> |
| 209 | 214 | ); |
| 210 | 215 | } |
| 216 | + } else if (pageText === "quotation") { | |
| 217 | + if (location.pathname === "/indexMobile/quotationDetail") { | |
| 218 | + return ( | |
| 219 | + | |
| 220 | + <QuotationDetail {...this.props} sModelType={pageText} sModelsId="101251240115016076506222050" /> | |
| 221 | + ) | |
| 222 | + } else { | |
| 223 | + return ( | |
| 224 | + <div className={styles.demoContainer}> | |
| 225 | + <Quotation {...this.props} sModelType={pageText} sModelsId="101251240115016076506222050" /> | |
| 226 | + </div> | |
| 227 | + ); | |
| 228 | + } | |
| 211 | 229 | } |
| 212 | 230 | } |
| 213 | 231 | |
| ... | ... | @@ -378,6 +396,42 @@ class IndexMobile extends React.Component { |
| 378 | 396 | style={{ |
| 379 | 397 | width: "22px", |
| 380 | 398 | height: "22px", |
| 399 | + background: `url(${Icon61}) center center / 21px 21px no-repeat`, | |
| 400 | + }} | |
| 401 | + /> | |
| 402 | + } | |
| 403 | + selectedIcon={ | |
| 404 | + <div | |
| 405 | + style={{ | |
| 406 | + width: "22px", | |
| 407 | + height: "22px", | |
| 408 | + background: `url(${Icon6}) center center / 21px 21px no-repeat`, | |
| 409 | + }} | |
| 410 | + /> | |
| 411 | + } | |
| 412 | + title="报价" | |
| 413 | + key="quotation" | |
| 414 | + // badge="2" | |
| 415 | + selected={this.state.selectedTab === "quotation"} | |
| 416 | + onPress={() => { | |
| 417 | + const { app } = this.props; | |
| 418 | + const { token } = app; | |
| 419 | + commonBusiness.clearSocketData({ token, value: {}, sModelsId: 100 }); | |
| 420 | + this.setState({ | |
| 421 | + selectedTab: "quotation", | |
| 422 | + title: "报价下单", | |
| 423 | + }); | |
| 424 | + history.push("/indexMobile"); | |
| 425 | + }} | |
| 426 | + > | |
| 427 | + {this.state.selectedTab === "quotation" ? this.renderContent(this.state.selectedTab) : ""} | |
| 428 | + </TabBar.Item> | |
| 429 | + <TabBar.Item | |
| 430 | + icon={ | |
| 431 | + <div | |
| 432 | + style={{ | |
| 433 | + width: "22px", | |
| 434 | + height: "22px", | |
| 381 | 435 | background: `url(${Icon51}) center center / 21px 21px no-repeat`, |
| 382 | 436 | }} |
| 383 | 437 | /> | ... | ... |
src/routes/mobile/common/ContactsInfoMobile.js
src/routes/mobile/common/ContactsMobile.js
src/routes/mobile/common/DeviceMobile.js
src/routes/mobile/common/ExamineMobile.js
src/routes/mobile/common/MessageMobile.js
src/routes/mobile/common/MyselfMobile.js
src/routes/mobile/common/NewsMobile.js
src/routes/mobile/common/ProcessReportMobile.js
src/routes/mobile/common/RevisePasswordMobile.js
src/routes/mobile/common/SceneCssMobile.js
src/routes/mobile/common/SceneSrmMobile.js
src/routes/mobile/common/WorkBenchMobile.js
src/routes/mobile/common/commobilePrintPdf.js
src/routes/mobile/logincss/LoginCss.js
src/routes/mobile/loginsrm/LoginSrm.js
src/routes/mobile/quotation/detail.js
0 → 100644
| 1 | +import { connect } from "umi"; | |
| 2 | +import QuotationAllprogressDetail from "@/mobile/quotation/detail.jsx"; | |
| 3 | + | |
| 4 | +function quotationDetail({ dispatch, app, content, location, sModelsId }) { | |
| 5 | + const quotationProps = { | |
| 6 | + app, | |
| 7 | + content, | |
| 8 | + dispatch, | |
| 9 | + location, // 只传递需要的部分 | |
| 10 | + sModelsId, | |
| 11 | + }; | |
| 12 | + return <QuotationAllprogressDetail {...quotationProps} />; | |
| 13 | +} | |
| 14 | + | |
| 15 | +const mapStateToProps = ({ app, content }) => ({ | |
| 16 | + app, | |
| 17 | + content, | |
| 18 | +}); | |
| 19 | + | |
| 20 | +export default connect(mapStateToProps)(quotationDetail); | |
| 0 | 21 | \ No newline at end of file | ... | ... |
src/routes/mobile/quotation/index.js
0 → 100644
| 1 | +import { connect } from "umi"; | |
| 2 | +import QuotationAllprogress from "@/mobile/quotation/index.jsx"; | |
| 3 | + | |
| 4 | +function quotation({ dispatch, app, content, location, sModelsId }) { | |
| 5 | + const quotationProps = { | |
| 6 | + app, | |
| 7 | + content, | |
| 8 | + dispatch, | |
| 9 | + location, // 只传递需要的部分 | |
| 10 | + sModelsId, | |
| 11 | + }; | |
| 12 | + return <QuotationAllprogress {...quotationProps} />; | |
| 13 | +} | |
| 14 | + | |
| 15 | +const mapStateToProps = ({ app, content }) => ({ | |
| 16 | + app, | |
| 17 | + content, | |
| 18 | +}); | |
| 19 | + | |
| 20 | +export default connect(mapStateToProps)(quotation); | |
| 0 | 21 | \ No newline at end of file | ... | ... |