wjx 1 рік тому
батько
коміт
b1e2087272

+ 3 - 2
src/pages/gameDataStatistics/roleOperate/gameServer/assignUser.tsx

@@ -47,10 +47,11 @@ const AssignUser: React.FC<Props> = ({ visible, onChange, onClose, assignType, i
     }
 
     return <Modal
-        title={<strong>指派{assignType === 'GAME_SERVER_ASSIGN_CUSTOMER' ? '客服' : 'GS'}</strong>}
+        title={<strong>{initialValues?.idList?.length > 1 ? '批量' : ''}指派{assignType === 'GAME_SERVER_ASSIGN_CUSTOMER' ? '客服' : 'GS'}</strong>}
         visible={visible}
         onCancel={onClose}
         onOk={handleOk}
+        confirmLoading={gameServerAssign.loading}
     >
         <Form
             name="basicAssignUser"
@@ -75,7 +76,7 @@ const AssignUser: React.FC<Props> = ({ visible, onChange, onClose, assignType, i
                         (option?.children as any)?.toLowerCase().indexOf(input.toLowerCase()) >= 0
                     }
                 >
-                    {list.map((item: any) => <Select.Option value={item.userId} key={item.userId}>{item.nickname}</Select.Option>)}
+                    {list.map((item: any) => <Select.Option value={Number(item.userId)} key={item.userId}>{item.nickname}</Select.Option>)}
                 </Select>
             </Form.Item>
         </Form>

+ 37 - 28
src/pages/gameDataStatistics/roleOperate/gameServer/index.tsx

@@ -34,7 +34,7 @@ const GameServer: React.FC = () => {
     const [visible, setVisible] = useState<boolean>(false)
     const [initialValues, setInitialValues] = useState<any>({})
     const [show, set_show] = useState(false)
-    // const [selectedRowKeys, setSelectedRowKeys] = useState<any[]>([])
+    const [selectedRowKeys, setSelectedRowKeys] = useState<any[]>([])
     const [assignType, setAssignType] = useState<'GAME_SERVER_ASSIGN_CUSTOMER' | 'GAME_SERVER_ASSIGN_GS'>('GAME_SERVER_ASSIGN_CUSTOMER')
     const [assignVisible, setAssignVisible] = useState<boolean>(false)
     const [assignData, setAssignData] = useState<any>({})
@@ -178,7 +178,16 @@ const GameServer: React.FC = () => {
                             <Button icon={<PlusOutlined />} type="primary" onClick={() => { setVisible(true); setInitialValues({ startTime: moment().add(90, 'd') }) }}>新增游戏区服</Button>
                             <Button icon={<PlusOutlined />} type="primary" onClick={() => { set_show(true) }}>新增合服</Button>
                             <UploadExcel gameList={game_supper_list_api?.data} onChange={() => getGameServerList.refresh()} />
-                            {/* <Button icon={<PlusOutlined />} disabled={selectedRowKeys?.length === 0} type="primary" onClick={() => {  }}>指派</Button> */}
+                            <Button icon={<PlusOutlined />} disabled={selectedRowKeys?.length === 0} type="primary" onClick={() => {
+                                setAssignType('GAME_SERVER_ASSIGN_CUSTOMER')
+                                setAssignData({ idList: selectedRowKeys.map(item => item.id), assignUserIdList: [] })
+                                setAssignVisible(true)
+                            }}>批量指派客服</Button>
+                            <Button icon={<PlusOutlined />} disabled={selectedRowKeys?.length === 0} type="primary" onClick={() => {
+                                setAssignType('GAME_SERVER_ASSIGN_GS')
+                                setAssignData({ idList: selectedRowKeys.map(item => item.id), assignUserIdList: [] })
+                                setAssignVisible(true)
+                            }}>批量指派GS</Button>
                         </Space>
                     </Col>
                 </Row>
@@ -212,32 +221,32 @@ const GameServer: React.FC = () => {
                     total={getGameServerList?.data?.total}
                     loading={getGameServerList?.loading}
                     defaultPageSize={20}
-                // rowSelection={{
-                //     getCheckboxProps: (record: any) => ({
-                //         disabled: selectedRowKeys?.length > 0 && record.gameId !== (selectedRowKeys[0] as any).gameId
-                //     }),
-                //     selectedRowKeys: selectedRowKeys.map((item: any) => item?.id.toString()),
-                //     onSelect: (record: any, selected: boolean, selectedRows: any) => {
-                //         let newSelectedRowKeys: any[] = JSON.parse(JSON.stringify(selectedRowKeys))
-                //         if (selected) {
-                //             newSelectedRowKeys.push(record)
-                //         } else {
-                //             newSelectedRowKeys = newSelectedRowKeys.filter(item => item.id != record.id)
-                //         }
-                //         setSelectedRowKeys(newSelectedRowKeys)
-                //     },
-                //     onSelectAll: (selected: boolean, selectedRows: any, changeRows: any) => {
-                //         let newSelectedRowKeys: any[] = JSON.parse(JSON.stringify(selectedRowKeys))
-                //         let gameId = newSelectedRowKeys?.[0]?.gameId || changeRows?.[0]?.gameId
-                //         if (selected) {
-                //             newSelectedRowKeys = newSelectedRowKeys.concat(changeRows.filter((item: { gameId: any }) => item.gameId === gameId))
-                //         } else {
-                //             let changeRowsIds: any[] = changeRows.map((item: { id: any }) => item.id);
-                //             newSelectedRowKeys = newSelectedRowKeys.filter(item => !changeRowsIds.includes(item.id))
-                //         }
-                //         setSelectedRowKeys(newSelectedRowKeys)
-                //     }
-                // }}
+                    rowSelection={{
+                        getCheckboxProps: (record: any) => ({
+                            disabled: selectedRowKeys?.length > 0 && record.gameId !== (selectedRowKeys[0] as any).gameId
+                        }),
+                        selectedRowKeys: selectedRowKeys.map((item: any) => item?.id.toString()),
+                        onSelect: (record: any, selected: boolean, selectedRows: any) => {
+                            let newSelectedRowKeys: any[] = JSON.parse(JSON.stringify(selectedRowKeys))
+                            if (selected) {
+                                newSelectedRowKeys.push(record)
+                            } else {
+                                newSelectedRowKeys = newSelectedRowKeys.filter(item => item.id != record.id)
+                            }
+                            setSelectedRowKeys(newSelectedRowKeys)
+                        },
+                        onSelectAll: (selected: boolean, selectedRows: any, changeRows: any) => {
+                            let newSelectedRowKeys: any[] = JSON.parse(JSON.stringify(selectedRowKeys))
+                            let gameId = newSelectedRowKeys?.[0]?.gameId || changeRows?.[0]?.gameId
+                            if (selected) {
+                                newSelectedRowKeys = newSelectedRowKeys.concat(changeRows.filter((item: { gameId: any }) => item.gameId === gameId))
+                            } else {
+                                let changeRowsIds: any[] = changeRows.map((item: { id: any }) => item.id);
+                                newSelectedRowKeys = newSelectedRowKeys.filter(item => !changeRowsIds.includes(item.id))
+                            }
+                            setSelectedRowKeys(newSelectedRowKeys)
+                        }
+                    }}
                 />
             </div>
         </Space>

+ 1 - 1
src/pages/gameDataStatistics/roleOperate/gameServer/tableConfig.tsx

@@ -153,8 +153,8 @@ function columnsPos(editGameServer: (data: any) => void, del: (id: number) => vo
                 <Row justify='center' gutter={[10, 0]}>
                     {b?.isSourceServer ? <>
                         <Col><a style={{ fontSize: "12px" }} onClick={() => { handleAssign(b, 'GAME_SERVER_ASSIGN_CUSTOMER') }}><BranchesOutlined /> 指派客服</a></Col>
-                        <Col><a style={{ fontSize: "12px" }} onClick={() => { handleAssign(b, 'GAME_SERVER_ASSIGN_GS') }}><BranchesOutlined /> 指派GS</a></Col>
                         <Col><a style={{ fontSize: "12px" }} onClick={() => { editGameServer(b) }}><EditOutlined /> 修改</a></Col>
+                        <Col><a style={{ fontSize: "12px" }} onClick={() => { handleAssign(b, 'GAME_SERVER_ASSIGN_GS') }}><BranchesOutlined /> 指派GS</a></Col>
                         <Col>
                             <Popconfirm
                                 title="确定删除?"

+ 4 - 1
src/pages/gameDataStatistics/roleOperate/roleRechargeRanking/index.tsx

@@ -13,6 +13,7 @@ import RoleCz from "./roleCz"
 import Assign from "./assign"
 import ChangeLog from "./changeLog"
 import MsgPushModal from "./msgPushModal"
+import TaskList from "./taskList"
 
 let ajax: any = null
 const RoleRechargeRanking: React.FC = () => {
@@ -93,8 +94,9 @@ const RoleRechargeRanking: React.FC = () => {
                 <Button type="primary" size="small" disabled={selectedRowKeys.length === 0} onClick={() => sendEmail(selectedRowKeys)}>批量发送邮件</Button>
                 {/* <Button type="primary" size="small" disabled={selectedRowKeys.length === 0} onClick={() => roleHandle(selectedRowKeys)}>批量角色操作</Button> */}
                 <Button type="primary" size="small" disabled={selectedRowKeys.length === 0} onClick={() => assignHandle(selectedRowKeys)}>批量指派</Button>
-                {/* <Button type="primary" size="small" disabled={selectedRowKeys.length === 0} onClick={() => setMsgVisible(true)}>游戏内消息推送</Button> */}
+                <Button type="primary" size="small" disabled={selectedRowKeys.length === 0} onClick={() => setMsgVisible(true)}>游戏内消息推送</Button>
                 <Button type="primary" danger size="small" disabled={selectedRowKeys.length === 0} onClick={() => setSelectedRowKeys([])}>清空选择</Button>
+                <TaskList sourceSystem={queryForm.sourceSystem} />
             </Space>}
             leftChild={<QueryForm
                 initialValues={{ sourceSystem: 'ZX_ONE', rechargeDay: [moment(), moment()] }}
@@ -231,6 +233,7 @@ const RoleRechargeRanking: React.FC = () => {
         {changeLogVisible && <ChangeLog data={data?.[0]} visible={changeLogVisible} onClose={() => setChangeLogVisible(false)} />}
         {/* 游戏内消息推送 */}
         {msgVisible && <MsgPushModal
+            gameId={selectedRowKeys?.[0].role_reg_game_id}
             roleRechargeRankingDTO={queryForm}
             roleIds={selectedRowKeys.map(item => item.role_id)}
             visible={msgVisible}

+ 4 - 3
src/pages/gameDataStatistics/roleOperate/roleRechargeRanking/msgPushModal.tsx

@@ -7,7 +7,8 @@ import { useAjax } from "@/Hook/useAjax"
 
 interface Props {
     roleRechargeRankingDTO: any
-    roleIds: any[]
+    roleIds: any[],
+    gameId: number,
     visible?: boolean
     onClose?: () => void
     onChange?: () => void
@@ -18,7 +19,7 @@ interface Props {
  * @param param0 
  * @returns 
  */
-const MsgPushModal: React.FC<Props> = ({ visible, onClose, onChange, roleRechargeRankingDTO, roleIds }) => {
+const MsgPushModal: React.FC<Props> = ({ visible, onClose, onChange, roleRechargeRankingDTO, roleIds, gameId }) => {
 
     /*************************/
     const [form] = Form.useForm()
@@ -30,7 +31,7 @@ const MsgPushModal: React.FC<Props> = ({ visible, onClose, onChange, roleRecharg
 
     const handleOk = async () => {
         let validate = await form.validateFields()
-        let params = { ...validate, roleRechargeRankingDTO, roleIds }
+        let params = { ...validate, roleRechargeRankingDTO, roleIds, gameId }
         console.log(params)
         sendMsgTask.run(params).then(res => {
             if (res) {

+ 67 - 4
src/pages/gameDataStatistics/roleOperate/roleRechargeRanking/tableConfig.tsx

@@ -228,14 +228,14 @@ function columns12(
                     title: '是否转端', dataIndex: 'is_change_game_type', label: '客户运营操作', align: 'center', width: 60,
                     render: (a: any, b: any) => {
                         // return <IsTrue value={a ? '1' : '0'} onChange={(value) => handleIsTrue(value, b, 'isChangeGameType')} />
-                        return a ? <Badge status="success" text="是" /> : a === 0 ? <Badge status="default" text="否"/> : '--'
+                        return a ? <Badge status="success" text="是" /> : a === 0 ? <Badge status="default" text="否" /> : '--'
                     },
                 },
                 {
                     title: '是否添加企微', dataIndex: 'is_add_corp_wechat', label: '客户运营操作', align: 'center', width: 60,
                     render: (a: any, b: any) => {
                         // return <IsTrue value={a ? '1' : '0'} onChange={(value) => handleIsTrue(value, b, 'isAddCorpWechat')} />
-                        return a ? <Badge status="success" text="是" /> : a === 0 ? <Badge status="default" text="否"/> : '--'
+                        return a ? <Badge status="success" text="是" /> : a === 0 ? <Badge status="default" text="否" /> : '--'
                     },
                 },
                 {
@@ -270,14 +270,14 @@ function columns12(
                     title: '是否退游', dataIndex: 'is_remove_game', label: '客户运营操作', align: 'center', width: 50,
                     render: (a: any, b: any) => {
                         // return <IsTrue value={a ? '1' : '0'} onChange={(value) => handleIsTrue(value, b, 'isRemoveGame')} />
-                        return a ? <Badge status="error" text="是" /> : a === 0 ? <Badge status="processing" text="否"/> : '--'
+                        return a ? <Badge status="error" text="是" /> : a === 0 ? <Badge status="processing" text="否" /> : '--'
                     },
                 },
                 {
                     title: '是否唤醒', dataIndex: 'is_wake_up', label: '客户运营操作', align: 'center', width: 50,
                     render: (a: any, b: any) => {
                         // return <IsTrue value={a ? '1' : '0'} onChange={(value) => handleIsTrue(value, b, 'isWakeUp')} />
-                        return a ? <Badge status="success" text="是" /> : a === 0 ? <Badge status="default" text="否"/> : '--'
+                        return a ? <Badge status="success" text="是" /> : a === 0 ? <Badge status="default" text="否" /> : '--'
                     },
                 },
                 {
@@ -600,4 +600,67 @@ export const columnsChangeLog = (update: (data: any) => void, del: (id: number[]
     ]
 };
 
+export const columnsMsgTask = () => {
+
+    return [
+        {
+            title: '任务名称',
+            dataIndex: 'taskName',
+            key: 'taskName',
+            width: 100,
+            ellipsis: true
+        },
+        {
+            title: '游戏名称',
+            dataIndex: 'gameName',
+            key: 'gameName',
+            width: 90,
+            ellipsis: true
+        },
+        {
+            title: '消息内容',
+            dataIndex: 'msg',
+            key: 'msg',
+            width: 120,
+            ellipsis: true
+        },
+        {
+            title: '任务人数',
+            dataIndex: 'roleIdCount',
+            key: 'roleIdCount',
+            width: 60
+        },
+        {
+            title: '任务状态',
+            dataIndex: 'status',
+            key: 'status',
+            width: 90,
+            render: (a: any) => {
+                return { SUCCESS_SEND: <Badge status="success" text="已发送" />, WAIT_SEND: <Badge status="default" text="待发送" /> }[a]
+            }
+        },
+        {
+            title: '创建人',
+            dataIndex: 'createName',
+            key: 'createName',
+            width: 60,
+            ellipsis: true
+        },
+        {
+            title: '创建时间',
+            dataIndex: 'createTime',
+            key: 'createTime',
+            width: 145,
+            ellipsis: true
+        },
+        {
+            title: '更新时间',
+            dataIndex: 'updateTime',
+            key: 'updateTime',
+            width: 145,
+            ellipsis: true
+        }
+    ]
+}
+
 export default columns12

+ 99 - 0
src/pages/gameDataStatistics/roleOperate/roleRechargeRanking/taskList.tsx

@@ -0,0 +1,99 @@
+import { useAjax } from "@/Hook/useAjax"
+import Tables from "@/components/Tables"
+import { getGameListNewApi } from "@/services/gameData"
+import { getSendMsgTaskListApi } from "@/services/gameData/roleOperate"
+import { SyncOutlined } from "@ant-design/icons"
+import { Button, Modal, Select, Space, message } from "antd"
+import React, { useEffect, useState } from "react"
+import { columnsMsgTask } from "./tableConfig"
+
+interface Props {
+    sourceSystem?: string
+}
+/**
+ * 消息推送任务列表
+ * @returns 
+ */
+const TaskList: React.FC<Props> = ({ sourceSystem }) => {
+
+    /****************************/
+    const [visible, setVisible] = useState<boolean>(false)
+    const [gameList, setGameList] = useState<any[]>([])
+    const [gameId, setGameId] = useState<number>()
+    const [queryForm, setQueryForm] = useState<{ pageNum: number, pageSize: number }>({ pageNum: 1, pageSize: 20 })
+
+    const getGameListNew = useAjax((params) => getGameListNewApi(params))
+    const getSendMsgTaskList = useAjax((params) => getSendMsgTaskListApi(params))
+    /****************************/
+
+    useEffect(() => {
+        if (gameId && visible) {
+            getSendMsgTaskList.run({ ...queryForm, gameId })
+        }
+    }, [queryForm, gameId, visible])
+
+    const open = () => {
+        if (sourceSystem) {
+            setVisible(true)
+            getGameListNew.run({ sourceSystem }).then(res => {
+                const { gameList } = res
+                setGameList(gameList?.map((item: { id: any; game_name: any }) => ({ id: item.id, name: item.game_name })) || [])
+                setGameId(gameList?.[0]?.id)
+            })
+        } else {
+            message.error('请选择数据源')
+        }
+    }
+
+
+
+    return <>
+        <Button type="primary" size="small" onClick={open}>消息推送任务列表</Button>
+        <Modal
+            title={<Space>
+                <strong>消息推送任务列表</strong>
+                <Select
+                    maxTagCount={1}
+                    showSearch
+                    style={{ minWidth: 140 }}
+                    loading={getGameListNew.loading}
+                    placeholder={'请选择游戏'}
+                    filterOption={(input, option) =>
+                        (option?.children as any)?.toLowerCase().indexOf(input.toLowerCase()) >= 0
+                    }
+                    value={gameId}
+                    onChange={(e) => setGameId(e)}
+                >
+                    {gameList?.map((item: any) => <Select.Option value={item.id} key={item.id}>{item.name}</Select.Option>)}
+                </Select>
+                <Button type="link" icon={<SyncOutlined />} onClick={() => getSendMsgTaskList.refresh()} loading={getSendMsgTaskList.loading} />
+            </Space>}
+            visible={visible}
+            onCancel={() => setVisible(false)}
+            footer={null}
+            width={1000}
+        >
+            <Tables
+                bordered
+                current={queryForm.pageNum}
+                pageSize={queryForm.pageSize}
+                columns={columnsMsgTask()}
+                dataSource={getSendMsgTaskList?.data?.records}
+                scroll={{ x: 1000, y: 600 }}
+                onChange={(pagination: any, filters: any, sortData: any) => {
+                    let { current, pageSize } = pagination
+                    let newQueryForm = JSON.parse(JSON.stringify(queryForm))
+                    newQueryForm.pageNum = current
+                    newQueryForm.pageSize = pageSize
+                    setQueryForm({ ...newQueryForm })
+                }}
+                size="small"
+                total={getSendMsgTaskList?.data?.total}
+                loading={getSendMsgTaskList?.loading}
+                defaultPageSize={20}
+            />
+        </Modal>
+    </>
+}
+
+export default React.memo(TaskList)

+ 23 - 12
src/services/gameData/roleOperate.ts

@@ -239,6 +239,29 @@ export async function getCombatRankingListApi(data: GetCombatRankingProps) {
         data
     });
 }
+/**
+ * 游戏消息发送
+ * @param data 
+ * @returns 
+ */
+export async function sendMsgTaskApi(data: { taskName: string, sendContent: string, roleIds: any[], roleRechargeRankingDTO: any }) {
+    return request(wapi + `/role/sendMsgTask`, {
+        method: 'POST',
+        data
+    });
+}
+
+/**
+ * 任务列表
+ * @param data 
+ * @returns 
+ */
+export async function getSendMsgTaskListApi(data: { gameId: number, pageNum: number, pageSize: number }) {
+    return request(wapi + '/role/sendMsgTask/list', {
+        method: 'POST',
+        data
+    });
+}
 
 let apiManage = api + '/manage'
 
@@ -576,16 +599,4 @@ export async function modalStrategyApi(data: StrategyProps) {
         method: 'POST',
         data
     });
-}
-
-/**
- * 游戏消息发送
- * @param data 
- * @returns 
- */
-export async function sendMsgTaskApi(data: { taskName: string, sendContent: string, roleIds: any[], roleRechargeRankingDTO: any }) {
-    return request(api + `/manage/role/sendMsgTask`, {
-        method: 'POST',
-        data
-    });
 }