diff --git a/includes/language/zh.json b/includes/language/zh.json index af5afdc..9228395 100644 --- a/includes/language/zh.json +++ b/includes/language/zh.json @@ -59,6 +59,7 @@ "ERR0057": "連動資料輸入錯誤", "ERR0058": "timezone輸入錯誤", "ERR0059": "timezone設定失敗", + "ERR0060": "手環ID輸入錯誤", "ERR7000": "命令執行失敗", diff --git a/public/js/admin_bundle.js b/public/js/admin_bundle.js index ac2ad4a..cbc939f 100644 --- a/public/js/admin_bundle.js +++ b/public/js/admin_bundle.js @@ -34369,7 +34369,7 @@ var DeviceSelect = function DeviceSelect(_ref) { permissions.dio ? _react2.default.createElement( 'option', { value: 'do' }, - i18n && i18n.t ? i18n.t('select.digitoutput') : '' + i18n && i18n.t ? i18n.t('select.digitaloutput') : '' ) : null, permissions.leone ? _react2.default.createElement( 'option', @@ -88088,8 +88088,11 @@ var LocStatus = function (_React$Component) { ), _react2.default.createElement( _semanticUiReact.Table.HeaderCell, - null, - '\u6642\u9593' + { className: 'pointer', onClick: function onClick() { + _this2.handlerSort('time'); + } }, + '\u66F4\u65B0\u6642\u9593', + this.renderSortIcon('time') ) ) ), @@ -88136,6 +88139,10 @@ var _LocStatus = __webpack_require__(1103); var _LocStatus2 = _interopRequireDefault(_LocStatus); +var _WristbandInfo = __webpack_require__(1141); + +var _WristbandInfo2 = _interopRequireDefault(_WristbandInfo); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -88165,9 +88172,13 @@ var WristbandPage = function (_React$Component) { page: page }); }, _this.getRenderPage = function () { + var i18n = _this.props.i18n; + switch (_this.state.page) { case 'locstatus': return _react2.default.createElement(_LocStatus2.default, null); + case 'wristband': + return _react2.default.createElement(_WristbandInfo2.default, null); default: return null; } @@ -88179,9 +88190,11 @@ var WristbandPage = function (_React$Component) { value: function render() { var _this2 = this; + var i18n = this.props.i18n; + return _react2.default.createElement( _semanticUiReact.Container, - { fluid: true }, + { fluid: true, style: { paddingLeft: '10px', paddingRight: '10px' } }, _react2.default.createElement( _semanticUiReact.Grid, null, @@ -88190,7 +88203,7 @@ var WristbandPage = function (_React$Component) { { width: 4 }, _react2.default.createElement( _semanticUiReact.Menu, - { vertical: true }, + { vertical: true, fluid: true }, _react2.default.createElement( _semanticUiReact.Menu.Item, null, @@ -88202,6 +88215,13 @@ var WristbandPage = function (_React$Component) { _react2.default.createElement( _semanticUiReact.Menu.Menu, null, + _react2.default.createElement( + _semanticUiReact.Menu.Item, + { active: this.state.page == 'wristband', onClick: function onClick() { + _this2.changePage('wristband'); + } }, + '\u624B\u74B0\u540D\u7A31\u8A2D\u5B9A' + ), _react2.default.createElement( _semanticUiReact.Menu.Item, { active: this.state.page == 'locstatus', onClick: function onClick() { @@ -88259,7 +88279,7 @@ var AlertItem = function AlertItem(_ref) { _react2.default.createElement( _semanticUiReact.Grid.Column, null, - _react2.default.createElement(_semanticUiReact.Label, { basic: true, content: type == 'di' ? "DigitInput" : "LeOne" }) + _react2.default.createElement(_semanticUiReact.Label, { basic: true, content: type == 'di' ? "DigitalInput" : "LeOne" }) ), _react2.default.createElement( _semanticUiReact.Grid.Column, @@ -88271,7 +88291,7 @@ var AlertItem = function AlertItem(_ref) { _semanticUiReact.Grid.Column, null, _react2.default.createElement(_semanticUiReact.Label, { basic: true, content: i18n && i18n.t ? i18n.t('dashboard.label.status') : '' }), - i18n && i18n.t ? type == 'di' ? i18n.t('dashboard.status.digitinput') : i18n.t('dashboard.status.leone') : '' + i18n && i18n.t ? type == 'di' ? i18n.t('dashboard.status.digitalinput') : i18n.t('dashboard.status.leone') : '' ) ); }; @@ -92851,5 +92871,413 @@ var PageRoot = function (_React$Component) { _reactDom2.default.render(_react2.default.createElement(PageRoot, null), document.getElementById('app')); +/***/ }), +/* 1139 */, +/* 1140 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _react = __webpack_require__(0); + +var _react2 = _interopRequireDefault(_react); + +var _semanticUiReact = __webpack_require__(8); + +var _actions = __webpack_require__(22); + +var _ListItem = __webpack_require__(1142); + +var _ListItem2 = _interopRequireDefault(_ListItem); + +var _WristbandModal = __webpack_require__(1143); + +var _WristbandModal2 = _interopRequireDefault(_WristbandModal); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var stateDefault = function stateDefault() { + return { + list: [], + modal: { + open: false, + type: 0, + data: {} + } + }; +}; + +var WristbandInfo = function (_React$Component) { + _inherits(WristbandInfo, _React$Component); + + function WristbandInfo() { + var _ref; + + var _temp, _this, _ret; + + _classCallCheck(this, WristbandInfo); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = WristbandInfo.__proto__ || Object.getPrototypeOf(WristbandInfo)).call.apply(_ref, [this].concat(args))), _this), _this.state = _extends({}, stateDefault()), _this.getList = function () { + var _this$props = _this.props, + showDialog = _this$props.showDialog, + toggleLoading = _this$props.toggleLoading; + + + fetch('/api/wristband/getwristbandlist', (0, _actions.getRequest)()).then(function (response) { + return response.json(); + }).then(function (json) { + if (json.status != 1) return showDialog(json.message); + _this.setState({ + list: json.data.record || [] + }); + }); + }, _this.delWristband = function (id) { + if (!id) return; + + fetch('/api/wristband/delwristband', (0, _actions.getRequest)({ id: id })).then(function (response) { + return response.json(); + }).then(function (json) { + if (json.status != 1) return showDialog(json.message); + _this.getList(); + }); + }, _this.openModal = function (type) { + var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _this.setState({ + modal: { + type: type, + data: data, + open: true + } + }); + }, _this.closeModal = function () { + _this.setState({ + modal: _extends({}, stateDefault().modal) + }); + }, _this.submitModal = function (type) { + var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var _this$props2 = _this.props, + showDialog = _this$props2.showDialog, + toggleLoading = _this$props2.toggleLoading; + + if (type == 1 && !data.id) return showDialog('資料取得失敗'); + if (type == 0 && !data.mac) return showDialog('請填寫手環ID'); + + var url = type == 1 ? '/api/wristband/editwristband' : '/api/wristband/addwristband'; + + fetch(url, (0, _actions.getRequest)(data)).then(function (response) { + return response.json(); + }).then(function (json) { + if (json.status != 1) return showDialog(json.message); + _this.setState({ + modal: _extends({}, stateDefault().modal) + }, function () { + _this.getList(); + }); + }); + }, _temp), _possibleConstructorReturn(_this, _ret); + } + + _createClass(WristbandInfo, [{ + key: 'componentDidMount', + value: function componentDidMount() { + this.getList(); + } + }, { + key: 'render', + value: function render() { + var _this2 = this; + + var i18n = this.props.i18n; + + return _react2.default.createElement( + _semanticUiReact.Container, + { fluid: true }, + _react2.default.createElement( + _semanticUiReact.Segment, + { className: 'clearfix' }, + _react2.default.createElement(_semanticUiReact.Button, { basic: true, color: 'green', icon: 'plus', content: '\u65B0\u589E', floated: 'right', onClick: function onClick() { + _this2.openModal(0); + }, style: { marginBottom: '15px' } }), + _react2.default.createElement( + _semanticUiReact.Table, + null, + _react2.default.createElement( + _semanticUiReact.Table.Header, + null, + _react2.default.createElement( + _semanticUiReact.Table.Row, + null, + _react2.default.createElement( + _semanticUiReact.Table.HeaderCell, + null, + '\u64CD\u4F5C' + ), + _react2.default.createElement( + _semanticUiReact.Table.HeaderCell, + null, + '\u624B\u74B0ID' + ), + _react2.default.createElement( + _semanticUiReact.Table.HeaderCell, + null, + '\u624B\u74B0\u540D\u7A31' + ) + ) + ), + _react2.default.createElement( + _semanticUiReact.Table.Body, + null, + this.state.list.map(function (t, idx) { + return _react2.default.createElement(_ListItem2.default, { key: idx, data: t, i18n: i18n, delWristband: _this2.delWristband, editWristband: _this2.openModal }); + }) + ) + ) + ), + _react2.default.createElement(_WristbandModal2.default, { i18n: i18n, + open: this.state.modal.open, + type: this.state.modal.type, + data: this.state.modal.data, + closeModal: this.closeModal, + submitModal: this.submitModal }) + ); + } + }]); + + return WristbandInfo; +}(_react2.default.Component); + +exports.default = WristbandInfo; + +/***/ }), +/* 1141 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _reactRedux = __webpack_require__(25); + +var _actions = __webpack_require__(22); + +var _WristbandInfo = __webpack_require__(1140); + +var _WristbandInfo2 = _interopRequireDefault(_WristbandInfo); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var mapStateToProps = function mapStateToProps(state) { + return { + i18n: state.i18n + }; +}; + +var mapDispatchToProps = function mapDispatchToProps(dispatch, ownProps) { + return { + showDialog: function showDialog(msg) { + dispatch((0, _actions.add_dialog_msg)(msg)); + }, + toggleLoading: function toggleLoading() { + var flag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + dispatch((0, _actions.toggle_loading)(flag)); + } + }; +}; + +exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_WristbandInfo2.default); + +/***/ }), +/* 1142 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _react = __webpack_require__(0); + +var _react2 = _interopRequireDefault(_react); + +var _semanticUiReact = __webpack_require__(8); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var ListItem = function ListItem(_ref) { + var i18n = _ref.i18n, + data = _ref.data, + delWristband = _ref.delWristband, + editWristband = _ref.editWristband; + + + return _react2.default.createElement( + _semanticUiReact.Table.Row, + null, + _react2.default.createElement( + _semanticUiReact.Table.Cell, + null, + _react2.default.createElement(_semanticUiReact.Button, { content: 'Edit', basic: true, onClick: function onClick() { + editWristband(1, data); + } }), + _react2.default.createElement(_semanticUiReact.Button, { content: 'Delete', basic: true, onClick: function onClick() { + delWristband(data.uid); + } }) + ), + _react2.default.createElement( + _semanticUiReact.Table.Cell, + null, + data.mac + ), + _react2.default.createElement( + _semanticUiReact.Table.Cell, + null, + data.name + ) + ); +}; + +exports.default = ListItem; + +/***/ }), +/* 1143 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _react = __webpack_require__(0); + +var _react2 = _interopRequireDefault(_react); + +var _semanticUiReact = __webpack_require__(8); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var WristbandModal = function WristbandModal(_ref) { + var i18n = _ref.i18n, + open = _ref.open, + type = _ref.type, + data = _ref.data, + closeModal = _ref.closeModal, + submitModal = _ref.submitModal; + + + return _react2.default.createElement( + _semanticUiReact.Modal, + { open: open }, + _react2.default.createElement(_semanticUiReact.Modal.Header, { content: type == 1 ? '修改資料' : '新增資料' }), + _react2.default.createElement( + _semanticUiReact.Modal.Content, + null, + _react2.default.createElement( + _semanticUiReact.Form, + { onSubmit: function onSubmit(e, d) { + e.preventDefault(); + submitModal(type, d.formData); + }, serializer: function serializer(e) { + var json = { + name: '', + identity: '', + monitor: 0, + notify: 0, + id: type == 1 ? data.uid : '', + mac: '' + }; + + var mac = e.querySelector('input[name="mac"]'); + if (mac && 'value' in mac) json.mac = mac.value; + var name = e.querySelector('input[name="name"]'); + if (name && 'value' in name) json.name = name.value; + var identity = e.querySelector('input[name="identity"]'); + if (identity && 'value' in identity) json.identity = identity.value; + var monitor = e.querySelector('input[name="monitor"]'); + if (monitor && 'checked' in monitor) json.monitor = monitor.checked ? 1 : 0; + var notify = e.querySelector('input[name="notify"]'); + if (notify && 'checked' in notify) json.notify = notify.checked ? 1 : 0; + + return json; + } }, + _react2.default.createElement( + _semanticUiReact.Form.Field, + null, + _react2.default.createElement(_semanticUiReact.Input, { label: '\u624B\u74B0ID', name: 'mac', defaultValue: data.mac, disabled: type == 1 }) + ), + _react2.default.createElement( + _semanticUiReact.Form.Field, + null, + _react2.default.createElement(_semanticUiReact.Input, { label: '\u540D\u7A31', name: 'name', defaultValue: data.name }) + ), + _react2.default.createElement( + _semanticUiReact.Form.Field, + null, + _react2.default.createElement(_semanticUiReact.Input, { label: '\u8EAB\u4EFD', name: 'identity', defaultValue: data.identity }) + ), + _react2.default.createElement( + _semanticUiReact.Form.Field, + null, + _react2.default.createElement(_semanticUiReact.Checkbox, { label: '\u76E3\u63A7', name: 'monitor', defaultChecked: data.monitor == 1 }) + ), + _react2.default.createElement( + _semanticUiReact.Form.Field, + null, + _react2.default.createElement(_semanticUiReact.Checkbox, { label: '\u901A\u77E5', name: 'notify', defaultChecked: data.notify == 1 }) + ), + _react2.default.createElement( + _semanticUiReact.Form.Field, + null, + _react2.default.createElement(_semanticUiReact.Checkbox, { label: '\u555F\u7528', name: 'switch', defaultChecked: data.switch == 1 }) + ), + _react2.default.createElement( + _semanticUiReact.Grid, + { columns: 2 }, + _react2.default.createElement( + _semanticUiReact.Grid.Column, + null, + _react2.default.createElement(_semanticUiReact.Button, { content: '\u9001\u51FA', fluid: true, type: 'submit' }) + ), + _react2.default.createElement( + _semanticUiReact.Grid.Column, + null, + _react2.default.createElement(_semanticUiReact.Button, { content: '\u53D6\u6D88', fluid: true, type: 'button', onClick: function onClick() { + closeModal(); + } }) + ) + ) + ) + ) + ); +}; +exports.default = WristbandModal; + /***/ }) /******/ ]); \ No newline at end of file diff --git a/public/locales/zh.json b/public/locales/zh.json index f6a372a..3a78a8d 100644 --- a/public/locales/zh.json +++ b/public/locales/zh.json @@ -74,8 +74,8 @@ }, "dio": { "title": { - "di": "DigitInput", - "do": "DigitOutput" + "di": "DigitalInput", + "do": "DigitalOutput" }, "form": { "label": { @@ -255,7 +255,7 @@ }, "status": { "leone": "無回應(網路問題或是IP/密碼錯誤)", - "digitinput": "觸發" + "digitalinput": "觸發" } }, "menu": { @@ -342,17 +342,17 @@ "sun": "週日" }, "porttype": [ - {"code": "1", "name":"DigitOutput"}, - {"code": "2", "name":"DigitInput"}, - {"code": "3", "name":"AnalogyOutput"}, - {"code": "4", "name":"AnalogyInput"} + { "code": "1", "name": "DigitalOutput" }, + { "code": "2", "name": "DigitalInput" }, + { "code": "3", "name": "AnalogyOutput" }, + { "code": "4", "name": "AnalogyInput" } ], "select": { "select_action": "請選擇動作", "dev_type": "請選擇裝置類型", "dev_name": "請選擇裝置", "action": "請選擇動作", - "digitoutput": "DigitOutput", + "digitaloutput": "DigitalOutput", "leone": "LeOne", "iogroup": "IOGroup" } diff --git a/route/api/modbus.js b/route/api/modbus.js index c73916c..105afc9 100644 --- a/route/api/modbus.js +++ b/route/api/modbus.js @@ -11,10 +11,10 @@ router .get('/', (req, res) => { res.send({ name: 'WebIO Modbus API' }); }) - .post('*', async(req,res,n) => { - try{ + .post('*', async(req, res, n) => { + try { res.db = await mysql.getConn(); - }catch(e){ + } catch (e) { console.log(`Get DB Connection ERROR ${e}`); return n('ERR8100'); } @@ -27,7 +27,7 @@ router let param = [config.db.db5, 'device']; res.db.query(query, param, (err, row) => { - if (err) return rt.err(res,err,n,'ERR8000'); + if (err) return rt.err(res, err, n, 'ERR8000'); res.api_res = { record: tool.checkArray(row) @@ -47,7 +47,7 @@ router let param = [config.db.db5, 'device', arr.data.id]; res.db.query(query, param, (err, row) => { - if (err || row.length == 0) return rt.err(res,err,n,'ERR8000'); + if (err || row.length == 0) return rt.err(res, err, n, 'ERR8000'); res.api_res = { record: tool.checkArray(row), @@ -80,7 +80,7 @@ router } return n(); }) - .catch(err => rt.err(res,err,n,'ERR8000')); + .catch(err => rt.err(res, err, n, 'ERR8000')); }); }) .post('/getporttype', (req, res, n) => { @@ -90,7 +90,7 @@ router let param = [config.db.db5, 'porttype']; res.db.query(query, param, (err, row) => { - if (err) return rt.err(res,err,n,'ERR8000'); + if (err) return rt.err(res, err, n, 'ERR8000'); res.api_res = { record: tool.checkArray(row) }; @@ -115,7 +115,7 @@ router let param = [config.db.db5, 'device', arr.data.name, arr.data.node, type, u, u]; res.db.query(query, param, (err, row) => { - if (err) return rt.err(res,err,n,'ERR8001'); + if (err) return rt.err(res, err, n, 'ERR8001'); res.api_res = { record: [] @@ -138,7 +138,7 @@ router let query = "select count(*) as num from ??.?? where `node` = ? and `uid` != ?"; let param = [config.db.db5, 'device', arr.data.node, arr.data.id]; res.db.query(query, param, (err, row) => { - if (err || row.length == 0) return rt.err(res,err,n,'ERR8000'); + if (err || row.length == 0) return rt.err(res, err, n, 'ERR8000'); if (row[0].num > 0) return n('ERR0047'); let u = ''; @@ -155,7 +155,7 @@ router `uid` = ?"; let param = [config.db.db5, 'device', arr.data.name, arr.data.node, type, u, arr.data.id]; res.db.query(query, param, (err, row) => { - if (err) return rt.err(res,err,n,'ERR8002'); + if (err) return rt.err(res, err, n, 'ERR8002'); let q = "delete from ??.?? where `node` in (?)"; let p = [config.db.db6, 'jcmbrt', [arr.data.node, arr.data.original_node]]; @@ -176,6 +176,8 @@ router if (!arr.data) return n('ERR0000'); if (!arr.data.id) return n('ERR0028'); + res.db.query(`use ${config.db.db5}`); + let query = "delete d,i,s,rt from ??.?? d \ left join ??.?? i \ on d.`uid` = i.`devuid` \ @@ -187,7 +189,7 @@ router d.`uid` = ?"; let param = [config.db.db5, 'device', config.db.db5, 'iolist', config.db.db5, 'aioset', config.db.db6, 'jcmbrt', arr.data.id]; res.db.query(query, param, (err, row) => { - if (err) return rt.err(res,err,n,'ERR8003'); + if (err) return rt.err(res, err, n, 'ERR8003'); res.api_res = { record: [] }; @@ -218,7 +220,7 @@ router let param = [config.db.db6, 'jcmbrt', config.db.db5, 'device', config.db.db5, 'iolist', arr.data.type, config.db.db5, 'aioset', arr.data.id, arr.data.type]; res.db.query(query, param, (err, row) => { - if (err) return rt.err(res,err,n,'ERR8000'); + if (err) return rt.err(res, err, n, 'ERR8000'); res.api_res = { record: tool.checkArray(row) @@ -235,7 +237,7 @@ router let query = "select * from ??.?? where `uid` = ? "; let param = [config.db.db5, 'iolist', arr.data.id]; res.db.query(query, param, (err, row) => { - if (err) return rt.err(res,err,n,'ERR8000'); + if (err) return rt.err(res, err, n, 'ERR8000'); res.api_res = { record: tool.checkArray(row) @@ -263,14 +265,14 @@ router and `addr` = ?"; let param = [config.db.db5, 'iolist', arr.data.id, arr.data.type, arr.data.addr]; res.db.query(query, param, (err, row) => { - if (err || row.length == 0) return rt.err(res,err,n,'ERR8000'); + if (err || row.length == 0) return rt.err(res, err, n, 'ERR8000'); if (row[0].c > 0) return n('ERR0054'); let query = "insert into ??.?? (`devuid`,`type`,`addr`,`num`,`datalen`,`ctime`,`mtime`) values (?, ?, ?, ?, ?, unix_timestamp(), unix_timestamp())"; let param = [config.db.db5, 'iolist', arr.data.id, arr.data.type, arr.data.addr, arr.data.num, dlen]; res.db.query(query, param, (err, row) => { - if (err) return rt.err(res,err,n,'ERR8001'); + if (err) return rt.err(res, err, n, 'ERR8001'); res.api_res = { record: [] @@ -301,7 +303,7 @@ router and i2.`uid` is not null "; let param = [config.db.db5, 'iolist', config.db.db5, 'iolist', arr.data.addr, arr.data.id, arr.data.id]; res.db.query(query, param, (err, row) => { - if (err || row.length == 0) return rt.err(res,err,n,'ERR8000'); + if (err || row.length == 0) return rt.err(res, err, n, 'ERR8000'); if (row[0].c > 0) return n('ERR0054'); let q = "update ??.?? set \ @@ -313,7 +315,7 @@ router `uid` = ?"; let p = [config.db.db5, 'iolist', arr.data.addr, arr.data.num, dlen, arr.data.id]; res.db.query(q, p, (err, row) => { - if (err) return rt.err(res,err,n,'ERR8002'); + if (err) return rt.err(res, err, n, 'ERR8002'); res.api_res = { record: [] @@ -338,7 +340,7 @@ router i.`uid` = ?"; let param = [config.db.db5, 'iolist', config.db.db5, 'aioset', arr.data.id]; res.db.query(query, param, (err, row) => { - if (err) return rt.err(res,err,n,'ERR8003'); + if (err) return rt.err(res, err, n, 'ERR8003'); res.api_res = { record: [] @@ -359,7 +361,7 @@ router i.`uid` = ?"; let param = [config.db.db5, 'aioset', config.db.db5, 'iolist', arr.data.id]; res.db.query(query, param, (err, row) => { - if (err) return rt.err(res,err,n,'ERR8000'); + if (err) return rt.err(res, err, n, 'ERR8000'); res.api_res = { record: tool.checkArray(row) @@ -376,7 +378,7 @@ router let query = "select * from ??.?? where `uid` = ?"; let param = [config.db.db5, 'aioset', arr.data.id]; res.db.query(query, param, (err, row) => { - if (err) return rt.err(res,err,n,'ERR8000'); + if (err) return rt.err(res, err, n, 'ERR8000'); res.api_res = { record: tool.checkArray(row) @@ -394,7 +396,7 @@ router let query = "delete from ??.?? where `uid` = ?"; let param = [config.db.db5, 'aioset', arr.data.id]; res.db.query(query, param, (err, row) => { - if (err) return rt.err(res,err,n,'ERR8003'); + if (err) return rt.err(res, err, n, 'ERR8003'); res.api_res = { record: [] }; @@ -418,7 +420,7 @@ router let query = "select count(*) as count from ??.?? where `iouid` = ? and `portnum` = ?"; let param = [config.db.db5, 'aioset', arr.data.iouid, arr.data.portnum]; res.db.query(query, param, (err, row) => { - if (err || row.length == 0) return rt.err(res,err,n,'ERR8000'); + if (err || row.length == 0) return rt.err(res, err, n, 'ERR8000'); if (row[0].count > 0) return n('ERR0054'); @@ -426,7 +428,7 @@ router (?, ?, ?, ?, ?, ?, ?, ?, unix_timestamp(), unix_timestamp())"; let p = [config.db.db5, 'aioset', arr.data.iouid, arr.data.name, arr.data.portnum, arr.data.type, arr.data.range_min, arr.data.range_max, arr.data.scale_min, arr.data.scale_max]; res.db.query(q, p, (err, row) => { - if (err) return rt.err(res,err,n,'ERR8001'); + if (err) return rt.err(res, err, n, 'ERR8001'); res.api_res = { record: [] @@ -458,7 +460,7 @@ router and `uid` != ?"; let param = [config.db.db5, 'aioset', arr.data.iouid, arr.data.portnum, arr.data.id]; res.db.query(query, param, (err, row) => { - if (err || row.length == 0) return rt.err(res,err,n,'ERR8000'); + if (err || row.length == 0) return rt.err(res, err, n, 'ERR8000'); if (row[0].length > 0) return n('ERR0054'); let query = "update ??.?? set \ @@ -473,7 +475,7 @@ router where `uid` = ?"; let param = [config.db.db5, 'aioset', arr.data.name, arr.data.portnum, arr.data.type, arr.data.range_min, arr.data.range_max, arr.data.scale_min, arr.data.scale_max, arr.data.id]; res.db.query(query, param, (err, row) => { - if (err) return rt.err(res,err,n,'ERR8002'); + if (err) return rt.err(res, err, n, 'ERR8002'); res.api_res = { record: [] @@ -482,34 +484,34 @@ router }); }); }) - .post('/modbuscmd', (req,res,n) => { + .post('/modbuscmd', (req, res, n) => { if (!config.permission.modbus) return n('ERR9000'); if (!tool.checkPermission(req)) return n('ERR9000'); let arr = req.body; if (!arr.data) return n('ERR0000'); - if(!arr.data.ip) return n('ERR0010'); - if(!('node' in arr.data) || arr.data.node.length == 0) return n('ERR0038'); - if(!('func' in arr.data) || arr.data.func.length == 0) return n('ERR0055'); - if(!('addr' in arr.data) || arr.data.addr.length == 0) return n('ERR0048'); - if(!('value' in arr.data) || arr.data.value.length == 0) return n('ERR0049'); + if (!arr.data.ip) return n('ERR0010'); + if (!('node' in arr.data) || arr.data.node.length == 0) return n('ERR0038'); + if (!('func' in arr.data) || arr.data.func.length == 0) return n('ERR0055'); + if (!('addr' in arr.data) || arr.data.addr.length == 0) return n('ERR0048'); + if (!('value' in arr.data) || arr.data.value.length == 0) return n('ERR0049'); let cmd = `mbtcpm ${arr.data.ip} ${arr.data.node} ${arr.data.func} ${arr.data.addr} ${arr.data.value}`; res.api_res = { record: [] }; exec(cmd, (err, stdout, stderr) => { - let msg = err ? err.toString() : `${stdout}${stderr}`; - res.api_res.record.push({msg}); + let msg = err ? err.toString() : `${stdout}${stderr}`; + res.api_res.record.push({ msg }); n(); }) }) - .post('/getmodbuslog', (req,res,n) => { + .post('/getmodbuslog', (req, res, n) => { if (!config.permission.modbus) return n('ERR9000'); let arr = req.body; - if(!arr.data) return n('ERR0000'); - if(!arr.data.ids || !Array.isArray(arr.data.ids)) return n('ERR0028'); - if(!arr.data.stime || !arr.data.etime) return n('ERR0015'); + if (!arr.data) return n('ERR0000'); + if (!arr.data.ids || !Array.isArray(arr.data.ids)) return n('ERR0028'); + if (!arr.data.stime || !arr.data.etime) return n('ERR0015'); let query = "select log.`node`, log.`type`, log.`port`, log.`value2` as value, log.`tst`, dev.`name` as devname, aio.`name` as aioname \ from ??.?? log \ @@ -531,8 +533,8 @@ router limit 0, 100"; let param = [config.db.db10, 'jcmbrt', config.db.db5, 'device', config.db.db5, 'iolist', config.db.db5, 'aioset', arr.data.ids, arr.data.stime, arr.data.etime]; - res.db.query(query, param, (err,row) => { - if(err) return rt.err(res,err,n,'ERR8000'); + res.db.query(query, param, (err, row) => { + if (err) return rt.err(res, err, n, 'ERR8000'); res.api_res = { record: tool.checkArray(row) } diff --git a/route/api/wristband.js b/route/api/wristband.js index cc8b49b..2cb3202 100644 --- a/route/api/wristband.js +++ b/route/api/wristband.js @@ -126,6 +126,7 @@ router n(); }) .post('/getstatus', (req, res, n) => { + if (!config.permission.wristband) return n('ERR9000'); let query = "select w.`name`, coalesce(l.`name`, l2.`name`) as locname, ll.*\ from ??.?? w\ @@ -172,6 +173,9 @@ router case 'loc': query += `order by locname ${sortorder}`; break; + case 'time': + query += 'order by ll.`timestamp` ' + sortorder; + break; default: query += 'order by w.`uid`'; break; @@ -186,6 +190,101 @@ router n(); }) }) + .post('/getwristbandlist', (req, res, n) => { + if (!config.permission.wristband) return n('ERR9000'); + + let query = "select * from ??.?? "; + let param = [config.db.db9, 'wristband']; + + res.db.query(query, param, (err, row) => { + if (err) return rt.err(res, err, n, 'ERR8000'); + + res.api_res = { + record: tool.checkArray(row) + }; + + n(); + }) + }) + .post('/delwristband', (req, res, n) => { + if (!config.permission.wristband) return n('ERR9000'); + if (!tool.checkPermission(req)) return n('ERR9000'); + let arr = req.body; + if (!arr.data) return n('ERR0000'); + if (!arr.data.id) return n('ERR0028'); + + res.db.query(`use ${config.db.db9}`); + let query = "delete from ??.?? where `uid` = ?"; + let param = [config.db.db9, 'wristband', arr.data.id]; + + res.db.query(query, param, (err, row) => { + if (err) return rt.err(res, err, n, 'ERR8003'); + + res.api_res = { + record: [] + }; + n(); + }); + }) + .post('/addwristband', (req, res, n) => { + if (!config.permission.wristband) return n('ERR9000'); + if (!tool.checkPermission(req)) return n('ERR9000'); + let arr = req.body; + if (!arr.data) return n('ERR0000') + if (!arr.data.mac) return n('ERR0060'); + + let name = arr.data.name || ''; + let identity = arr.data.identity || 0; + let monitor = arr.data.monitor || 0; + let notify = arr.data.notify || 0; + let sw = arr.data.switch || 0; + + let query = "insert into ??.?? (`mac`, `name`, `identity`, `monitor`, `notify`, `switch`, `ctime`, `mtime`) values \ + ( ?, ?, ?, ?, ?, ?, unix_timestamp(), unix_timestamp() )"; + let param = [config.db.db9, 'wristband', arr.data.mac, name, identity, monitor, notify, sw]; + + res.db.query(query, param, (err, row) => { + if (err) return rt.err(res, err, n, 'ERR8001'); + + res.api_res = { + record: [] + }; + n(); + }); + + }) + .post('/editwristband', (req, res, n) => { + if (!config.permission.wristband) return n('ERR9000'); + if (!tool.checkPermission(req)) return n('ERR9000'); + let arr = req.body; + if (!arr.data) return n('ERR0000'); + if (!arr.data.id) return n('ERR0028'); + + let name = arr.data.name || ''; + let identity = arr.data.identity || 0; + let monitor = arr.data.monitor || 0; + let notify = arr.data.notify || 0; + let sw = arr.data.switch || 0; + + let query = "update ??.?? set \ + `name` = ?, \ + `identity` = ?, \ + `monitor` = ?, \ + `notify` = ?, \ + `switch` = ?, \ + `mtime` = unix_timestamp() \ + where \ + `uid` = ?"; + let param = [config.db.db9, 'wristband', name, identity, monitor, notify, sw, arr.data.id]; + res.db.query(query, param, (err, row) => { + if (err) return rt.err(res, err, n, 'ERR8002'); + + res.api_res = { + record: [] + } + n(); + }) + }) .all('*', rt.send); module.exports = router; \ No newline at end of file diff --git a/src/components/AdminPage/Wristband/LocStatus/index.js b/src/components/AdminPage/Wristband/LocStatus/index.js index 8275175..4339747 100644 --- a/src/components/AdminPage/Wristband/LocStatus/index.js +++ b/src/components/AdminPage/Wristband/LocStatus/index.js @@ -138,7 +138,10 @@ class LocStatus extends React.Component{ SOS {this.renderSortIcon('val9')} - 時間 + {this.handlerSort('time')}}> + 更新時間 + {this.renderSortIcon('time')} + {/**/} diff --git a/src/components/AdminPage/Wristband/WristbandInfo/ListItem.js b/src/components/AdminPage/Wristband/WristbandInfo/ListItem.js new file mode 100644 index 0000000..52e4ace --- /dev/null +++ b/src/components/AdminPage/Wristband/WristbandInfo/ListItem.js @@ -0,0 +1,18 @@ +import React from 'react'; +import { Table, Button } from 'semantic-ui-react'; + +const ListItem = ({ i18n, data, delWristband, editWristband }) => { + + return ( + + +